Python装饰程序类型错误';对象不可调用';

Python装饰程序类型错误';对象不可调用';,python,decorator,python-2.x,Python,Decorator,Python 2.x,我想让自己熟悉一下装饰师。 这是我为此创建的程序,但它不断给我一个TypeError:“int”对象不可调用错误,我不知道如何修复 #Filename: decorator_practice.py def add(x): def add_1(): add_1 = x() + 1 return add_1 def minus(x): def minus_1(): return x() - 1 return minus_1 def

我想让自己熟悉一下装饰师。 这是我为此创建的程序,但它不断给我一个
TypeError:“int”对象不可调用
错误,我不知道如何修复

#Filename: decorator_practice.py

def add(x):
    def add_1():
        add_1 = x() + 1
    return add_1

def minus(x):
    def minus_1():
        return x() - 1
    return minus_1

def multi(x, times=2):
    def multi_2():
        return x() * 2
    def multi_3():
        return x() * 3
    def multi_4():
        return x() * 4

    if times == 2:
        return multi_2
    elif times == 3:
        return multi_3
    elif times == 4:
        return multi_4
    else:
        return "Please enter times between 2 and 4"

def create_x():
    x = input('Give variable x a value: ')
    return x

add(create_x()())
我运行此命令并键入:
5


有人能帮我吗?谢谢

您有不必要的
()
,请将
添加(create_x())
更改为
添加(create_x())
, 我建议使用
x=int(原始输入('Give variable x a value:'))

请参见以下示例:

def add(x):
    def add_1():
        #add_1 = x() + 1 # remove this line 
        return x+1
    return add_1

def create_x():
    x = input('Give variable x a value: ')
    return x

b = add(create_x())
print 'answer: ', b()

localhost# python t.py 
Give variable x a value: 5
answer: 6

您有不必要的
()
,请将
add(create_x())
更改为
add(create_x())
, 我建议使用
x=int(原始输入('Give variable x a value:'))

请参见以下示例:

def add(x):
    def add_1():
        #add_1 = x() + 1 # remove this line 
        return x+1
    return add_1

def create_x():
    x = input('Give variable x a value: ')
    return x

b = add(create_x())
print 'answer: ', b()

localhost# python t.py 
Give variable x a value: 5
answer: 6

create_x
函数返回一个整数:

所以
create_x()()
永远不会起作用

部分问题是您使用了糟糕的参数名称,这让您感到困惑-您有两个
x
s,它们表示两个完全不同的东西。以
add
decorator为例,修改为:

def add(func):
    def add_1():
        return func() + 1  # you should return from the inner function
    return add_1
现在希望很清楚,
add
的参数应该是一个函数,它在
add\u 1
中调用。因此,你可以:

adder = add(create_x)  # don't call create_x yet!
adder()  # calling add_1, which calls create_x
这简化为:

add(create_x)()  # note ordering of parentheses
请注意,这也可以写成:

@add
def create_x():
    ...

create_x()
其中语法
@add
表示
create\ux=add(create\ux)



一旦你掌握了简单的修饰符,请注意你的
multi
将不能像你期望的那样工作-例如,请参阅创建带参数的修饰符。

你的
create\u x
函数返回一个整数:

所以
create_x()()
永远不会起作用

部分问题是您使用了糟糕的参数名称,这让您感到困惑-您有两个
x
s,它们表示两个完全不同的东西。以
add
decorator为例,修改为:

def add(func):
    def add_1():
        return func() + 1  # you should return from the inner function
    return add_1
现在希望很清楚,
add
的参数应该是一个函数,它在
add\u 1
中调用。因此,你可以:

adder = add(create_x)  # don't call create_x yet!
adder()  # calling add_1, which calls create_x
这简化为:

add(create_x)()  # note ordering of parentheses
请注意,这也可以写成:

@add
def create_x():
    ...

create_x()
其中语法
@add
表示
create\ux=add(create\ux)




一旦你掌握了简单的修饰符,请注意你的
multi
将不能像你期望的那样工作-请参阅例如,创建带参数的修饰符。

我已经尝试过了!这不是解决办法:同样的问题仍然存在!add(create_x()())肯定是正确的,而不是add(create_x())!试试看@midkin很抱歉混淆了,请看我更新的示例。@PaulLo这不再是一个真正的例子,我已经尝试过了!这不是解决办法:同样的问题仍然存在!add(create_x()())肯定是正确的,而不是add(create_x())!试试看@midkin很抱歉混淆,请参阅我更新的示例。@PaulLo这不再是真正的装饰器,但为什么不呢?create_x返回x,假设是5!在函数中,add(x)将给我-->返回5+1!为什么不呢/因为它没有给你
5+1
,它给你
5()()+1
,试图调用
5
,就好像它是一个函数一样。这就是错误消息所指的内容。(如果调用
5
成功,您的程序将再次尝试调用结果。第一个调用来自
create_x()
中的第二组参数,第二个调用来自
add_1
中的
x()
)亲爱的未来读者:请注意上面是Python 2。在Python3中,
input()
将简单地返回输入,在Python2中,它将对其求值?create_x返回x,假设是5!在函数中,add(x)将给我-->返回5+1!为什么不呢/因为它没有给你
5+1
,它给你
5()()+1
,试图调用
5
,就好像它是一个函数一样。这就是错误消息所指的内容。(如果调用
5
成功,您的程序将再次尝试调用结果。第一个调用来自
create_x()
中的第二组参数,第二个调用来自
add_1
中的
x()
)亲爱的未来读者:请注意上面是Python 2。在Python3中,
input()
将简单地返回输入,在Python2中,它将对其求值。谢谢!!!但是,不应该添加(create_x())工作吗?我的意思是,不是添加(create_x()())???加法器()为什么工作?adder()==add(create_x())??@midkin不,正如我刚刚在它的
add(create_x)(
)中编辑的那样-括号的顺序很重要,你需要将一个函数传递给
add
,然后调用结果。你的尝试
add(create_x())
将向
添加传递一个整数,然后在
添加1
中无法调用该整数。更新:等待!!!添加(创建x)()不做我想做的事!它不会返回任何内容!!!它应该返回6!请尝试一下!@midkin您是否包含了我对
add
的修改?您需要
return
from
add\u 1
。我已经测试了我发布的代码,它在这里工作正常。很抱歉,您是对的!!!所以我的主要问题是我没有在add\u 1中返回,right?谢谢!!!但是,不应该添加(create_x())工作吗?我的意思是代替添加(create_x())??为什么adder()工作?adder()==add(create_x())不是吗?@midkin不,因为我刚刚编辑了它的
add(create_x)()
-括号的顺序很重要,您需要将一个函数传递到
add
,然后调用结果。您的尝试
add(create_x())
将传递一个整数到
add
,然后无法在
add_1
中调用。更新:等待!!!add(create_x)()不做我想做的!它不返回任何内容!!!它应该返回6!请尝试一下!@midkin您是否已将我的修改包含到
添加
?您需要
返回