Питоны декоратор обрабатывают доки
Вопрос
У меня есть проблема с использованием Docstrings с декораторами. Приведенный следующий пример:
def decorator(f):
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
Теперь помощь не показывает мне Docstring foo
Как и ожидалось, это показывает:
Help on function _decorator in module __main__:
_decorator()
Без декоратора помощь верна:
Help on function foo in module __main__:
foo()
the magic foo function
Я знаю, что функция foo
Обернут декоратором, и поэтому функциональный объект не является функцией foo
больше. Но каково хорошее решение, чтобы получить Docstring (и помощь), как и ожидалось?
Решение
Использовать functools.wraps()
Чтобы обновить атрибуты декоратора:
from functools import wraps
def decorator(f):
@wraps(f)
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
Также см Стандартная библиотечная документация за functools
.
Другие советы
Я нашел решение, но не знаю, действительно ли это хорошо:
def decorator(f):
def _decorator():
print 'decorator active'
f()
_decorator.__name__=f.__name__
_decorator.__doc__=f.__doc__
return _decorator
Часть с _decorator.__name__=f.__name__
Кажется немного отвратительным ... как ты думаешь?
Взгляни на functools.wraps
: http://docs.python.org/library/functools.html