Вопрос

У меня есть проблема с использованием 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top