2015-02-03 2 views
0

Я стараюсь познакомиться с декораторами. Это программа, которую я создал для этого, но она продолжает давать мне ошибку TypeError: 'int' object is not callable, которую я не знаю, как исправить.Python decorator TypeError '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

но почему бы и нет? create_x возвращает x, который позволяет говорить 5! в функции add (x) даст мне ---> return 5 + 1! Почему бы и нет? :/ – midkin

+1

Поскольку он не дает вам '5 + 1', он дает вам' 5()() + 1', пытаясь вызвать '5', как если бы это была функция. Это относится к сообщению об ошибке. (И если вызов '5' был успешным, ваша программа попытается снова вызвать результат. Первый вызов происходит из второго набора символов в вашем' create_x()() ', второй вызов происходит из' x() 'in' add_1'.) –

+1

Дорогие читатели из будущего: Пожалуйста, обратите внимание, что это выше ** Python 2 **. В Python 3, 'input()' просто вернет вход, в Python 2, он будет его оценивать. –

ответ

3

Ваш create_x функцию возвращает целое число:

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

так create_x()() is никогда не собирается работать.

Часть проблемы состоит в том, что вы использовали неправильные имена параметров, что вас сбивает с толку - у вас есть два x s, которые относятся к двум совершенно другим вещам. Использование 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 для создания декораторов, которые принимают аргументы.

+0

Спасибо !!! Однако не следует добавлять (create_x()) работу? Я имею в виду вместо add (create_x()()) ??? Почему сумматор() работает? не является adder() == add (create_x()() – midkin

+0

@midkin Нет, поскольку я только что отредактировал в нем 'add (create_x)()' - порядок круглых скобок важен, вам нужно * передайте ** функцию ** на 'add' *, а затем * вызовите результат *. Ваша попытка' add (create_x()) 'будет * передавать целое число' add' *, которое затем не может быть вызвано внутри 'add_1 '. – jonrsharpe

+0

UPDATE: Wait !!! add (create_x)() не делает то, что я хочу! Это не возвращает ничего !!! Он должен вернуть 6! Попробуйте! – midkin

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 
+0

Я пробовал!Это не решение: midkin

+0

@midkin Просмотреть мои обновления –

+0

Та же проблема все еще существует! – midkin

Смежные вопросы