Получить оформленный объект функции по имени строки - PullRequest
1 голос
/ 10 марта 2010
def log(func):
    def wraper(*a, **kw):   
        return func(*a, **kw)
    return wraper

@log
def f():
    print 'f'


print locals()['f'] # - prints <function wraper at 0x00CBF3F0>.

Как получить реальный объект f (не обтекатель декоратора)?

Ответы [ 3 ]

7 голосов
/ 10 марта 2010

Модуль functools также предоставляет декоратор wraps, который гарантирует, что упакованная функция больше похожа на реальную функцию: например, правильное имя, модуль и строку документации.

5 голосов
/ 10 марта 2010

Вы этого не сделаете. 1 Сохраните его, если вам понадобится доступ к нему позже.

def log(func):
  def wrapper(*a, **kw):
    return func(*a, **kw)
  wrapper.func = func
  return wrapper

@log
def f():
  print 'f'

print f.func

1 Вы можете связываться с закрытием, но я не могу его рекомендовать.

0 голосов
/ 18 сентября 2014

Если вы используете Python 3.2 или выше, и вы используете functools.wraps, то вы найдете функцию обернутой в атрибуте __wrapped__:

from functools import wraps

def log(func):
    @wraps(func)
    def wrapper(*a, **kw):
        return func(*a, **kw)
    return wrapper

@log
def f():
    print 'f'

print f.__wrapped__

functools.wraps - это удобная функция для украшения украшенной функции функцией, которая выполняет всю работу, включая добавление этого атрибута functools.update_wrapper.

...