2015-04-25 4 views
0

У меня есть пример на https://www.youtube.com для обертывания функций, но он генерирует исключение.python function wrapping not working

def addOne(myfunc): 

    def addOneInside(myfunc):  
     return myfunc()+1 

    return addOneInside 

def oldFunc(): 

    return 3 

oldFunc=addOne(oldFunc) 

print oldFunc() 

ошибка:

TypeError: addOneInside() takes exactly 1 argument (0 given)

любой орган может объяснить, что это проблема.

ответ

2

addOneInside не требуется аргумент. myfunc будет доступен через контекст.

Изменить его

def addOne(myfunc): 
    def addOneInside():  
     return myfunc()+1 
    return addOneInside 
+0

Более общее решение состоит в том, чтобы функция-обертка принимала любые аргументы с помощью 'def addOneInside (* args, ** kwargs) 'и передать их с помощью' return myfunc (* args, ** kwargs) + 1'. – Blckknght

+0

благодарит за ответ, k получил его :) –

0

термины здесь немного странно - это не строго переопределение функции, то функция упаковка. Я думаю, что вам нужен декоратор. @bytesized является правильным синтаксисом, но есть еще что узнать о том, что вы пытаетесь сделать. Вот отличная запись, которая может помочь (проходит через замыкания, локальные функции и работает до декораторов): http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/