Есть ли способ получить функцию, которую обернул декоратор? - PullRequest
4 голосов
/ 09 октября 2009

Предположим, у меня есть

@someDecorator
def func():
   '''this function does something'''
   print 1

Теперь объект func является экземпляром someDecorator. Есть ли способ, которым я могу получить доступ к функции, которую она содержит, например, func.getInnerFunction().

Например, если мне нужно получить строку документа func().

Ответы [ 5 ]

4 голосов
/ 09 октября 2009

См. Functools.wraps: http://docs.python.org/library/functools.html. Декоратор получает имя и строку документа исходной функции. Вы используете это так:

def decorator(f):
    @functools.wraps(f)
    def wrapper():
        ....
2 голосов
/ 09 октября 2009

SilentGhost и sri имеют частичные ответы о том, как с этим справиться. Но общий ответ - нет: нет способа вывести «обернутую» функцию из декорированной функции, потому что не требуется, чтобы декоратор обернул функцию в первую очередь. Он вполне мог вернуть совершенно не связанную функцию, и любые ссылки на ваш оригинал, возможно, уже были собраны сборщиком мусора.

1 голос
/ 09 октября 2009

Вы ищете что-то в этом роде?

>>> def dec(f):
    def inner():
        print(f.__doc__)
    return inner

>>> @dec
def test():
    """abc"""
    print(1)


>>> test()
abc

Вы передаете функцию явно декоратору, конечно, вы можете получить к ней доступ.

0 голосов
/ 15 февраля 2016

Вы можете попробовать использовать неокрашенную библиотеку :

На вашем примере func вы можете просто сделать это, чтобы вернуть исходную функцию:

undecorated(func)
0 голосов
/ 10 октября 2009

Вы можете прикрепить упакованную функцию к внутренней функции

In [1]: def wrapper(f):
   ...:     def inner():
   ...:         print "inner"
   ...:     inner._orig = f
   ...:     return inner
   ...: 

In [2]: @wrapper
   ...: def foo():
   ...:     print "foo"
   ...:     
   ...:     

In [3]: foo()
inner

In [4]: foo._orig()
foo
...