Получить оформленный объект функции по имени строки

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 (а не обертку декоратора)?


person evg    schedule 09.03.2010    source источник


Ответы (3)


Вы этого не сделаете.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 Вы можете возиться с закрытием, но я не могу этого рекомендовать.

person Community    schedule 09.03.2010

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

person Ned Batchelder    schedule 09.03.2010
comment
+1 Вероятно, это должен быть принятый ответ, поскольку functools.wraps делает больше, чем просто устанавливает wrapper.func = func. - person Jeffrey Jose; 10.03.2010
comment
На самом деле, кажется, что обертывания не делают именно то, что хотел ОП: он где-то не сохраняет исходную функцию. Но может случиться так, что OP не нужна функция, ему просто нужен атрибут. - person Ned Batchelder; 10.03.2010

Если вы используете 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.

person kinygos    schedule 18.09.2014