Ошибка при использовании декоратора для обновления оболочки

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

Я постарался сделать свой код как можно более общим, чтобы его можно было применять и в других ситуациях.

def decorator(d):
    """Make function d a decorator: d wraps a function fn."""

    def _d(fn):
        return functools.update_wrapper(d(fn), fn)
    functools.update_wrapper(_d, d)
    return _d


@decorator
def f(fn):
    """Converts the string fn to a function and returns it.
    Because of the @decorator decorator, _f.__name__ should
    be identical to f.__name__"""

    f.__name__ = fn
    def _f(fn):
        return eval(fn)
    return _f

g = f('x**2')
print g.__name__

Желаемый выход:

>>>x**2

Фактический выход:

Traceback (most recent call last):
  File "C:\python\swampy-2.0\testcode.py", line 18, in <module>
    g = f('x**2')
  File "C:\python\swampy-2.0\testcode.py", line 6, in _d
    return functools.update_wrapper(d(fn), fn)
  File "C:\Python27\lib\functools.py", line 33, in update_wrapper
    setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'str' object has no attribute '__module__'
8
задан Madison May 14 August 2012 в 20:44
поделиться