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 (а не обертку декоратора)?
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 (а не обертку декоратора)?
Вы этого не сделаете.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 Вы можете возиться с закрытием, но я не могу этого рекомендовать.
Модуль functools также предоставляет декоратор wraps
, который делает обернутую функцию более похожей на реальная функция: правильное имя, модуль и строка документации, например.
functools.wraps
делает больше, чем просто устанавливает wrapper.func = func
.
- person Jeffrey Jose; 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
.