Python 装饰器类型错误 'object is not callable'
Python decorator TypeError 'object is not callable'
我正在努力让自己熟悉装饰器。
这是我为此创建的一个程序,但它一直给我一个 TypeError: 'int' object is not callable
错误,我不知道如何修复。
#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
谁能帮帮我?谢谢!
你有不必要的()
,把add(create_x()())
改成add(create_x())
,
我建议使用 x = int(raw_input('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
函数returns一个整数:
def create_x():
x = input('Give variable x a value: ')
return x
所以 create_x()()
永远不会工作 。
部分问题是您使用了糟糕的参数名称,这让您感到困惑 - 您有两个 x
指的是两个 完全不同的东西 .以你的add
装饰器为例,修改为:
def add(func):
def add_1():
return func() + 1 # you should return from the inner function
return add_1
现在希望 add
的参数应该是一个在 add_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_x = add(create_x)
.
一旦您掌握了简单的装饰器,请注意您的 multi
将不会像您期望的那样工作 - 参见例如python decorators with parameters 用于创建带参数的装饰器。
我正在努力让自己熟悉装饰器。
这是我为此创建的一个程序,但它一直给我一个 TypeError: 'int' object is not callable
错误,我不知道如何修复。
#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
谁能帮帮我?谢谢!
你有不必要的()
,把add(create_x()())
改成add(create_x())
,
我建议使用 x = int(raw_input('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
函数returns一个整数:
def create_x():
x = input('Give variable x a value: ')
return x
所以 create_x()()
永远不会工作 。
部分问题是您使用了糟糕的参数名称,这让您感到困惑 - 您有两个 x
指的是两个 完全不同的东西 .以你的add
装饰器为例,修改为:
def add(func):
def add_1():
return func() + 1 # you should return from the inner function
return add_1
现在希望 add
的参数应该是一个在 add_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_x = add(create_x)
.
一旦您掌握了简单的装饰器,请注意您的 multi
将不会像您期望的那样工作 - 参见例如python decorators with parameters 用于创建带参数的装饰器。