我想让自己熟悉装饰器。
这是我创建的一个程序,但它一直给我一个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
任何人都可以帮助我吗?谢谢!
答案 0 :(得分:3)
您有不必要的()
,将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
答案 1 :(得分:3)
您的create_x
函数返回一个整数:
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用于创建带参数的装饰器。