Python装饰器TypeError'对象不可调用'

时间:2015-02-03 16:18:00

标签: python decorator python-2.x

我想让自己熟悉装饰器。 这是我创建的一个程序,但它一直给我一个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

任何人都可以帮助我吗?谢谢!

2 个答案:

答案 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用于创建带参数的装饰器。