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
fromadd\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您是否已将我的修改包含到添加
?您需要返回