вставка функции в пространство имен модуля с использованием декоратора - PullRequest
0 голосов
/ 22 февраля 2011

У меня есть декоратор, но я хотел бы сохранить исходную функцию в пространстве имен для дальнейшего использования, так что в итоге я получу декорированную и не декорированную версию функции.Я вставляю эту оригинальную функцию в пространство имен следующим образом:

def crossover(cross):  
    def ecspy_crossover(random, candidates, args):  
    # ... decorator magic
    globals()['single_'+cross.func_name] = cross

Однако при импорте модуля функции single_ * не отображаются.Когда я запускаю pdb в этом модуле, эта функция присутствует в пространстве имен ... [в этом модуле нет оператора __all__ ...]

Есть идеи?

1 Ответ

2 голосов
/ 22 февраля 2011

Почему бы просто не добавить исходную функцию в качестве атрибута упакованной функции?Фактически это именно то, что functools.wraps делает в Python 3.2, он сохраняет исходную функцию в атрибуте __wrapped__.

Что касается вашего вопроса, я думаю, что ваша проблема в том, что вы добавляете функцию вглобальное пространство имен модуля, содержащего декоратор, а не пространство декорированной функции.Вы можете использовать f.__globals__, чтобы получить правильное глобальное пространство имен.

...