[Python-Dev] Decorators and docstrings

Roman Suzi rnd at onego.ru
Sun Aug 15 10:50:53 CEST 2004


On Sat, 14 Aug 2004, Bob Ippolito wrote:

>On Aug 14, 2004, at 10:26 PM, Hans Nowak wrote:
>
>> When playing with the decorators in 2.4a2, I saw the following
>> behavior:
>>
>> # wraps an object with the function, and prints this object
>> # when the function is called.
>> >>> def wrapwith(obj):
>> ...     def decorator(f):
>> ...         def _wrapper(*args, **kwargs):
>> ...             print "##", obj
>> ...             return f(*args, **kwargs)
>> ...         return _wrapper
>> ...     return decorator
>> ...
>> >>> @wrapwith("hello")
>> ... def foo(x, y):
>> ...     """ foo! """
>> ...     return 2*x + y
>> ...
>> >>> foo(4, 5)
>> ## hello
>> 13
>> >>> foo.__doc__
>> >>>
>>
>> I.e. if you wrap the function foo with the decorator, it loses the
>> docstring. foo.__doc__ is empty.
>>
>> Is this behavior intended?  Should the decorator in question (in this
>> case, 'wrapwith') take care of copying of the docstring itself?  Or
>> should the decorator mechanism do this automatically (if possible)?
>
>Decorators aren't that special.  If you want to return a function
>object that has the same doc string as the original then you're going
>to have to return the original object or explicitly make sure your new
>function object has the same doc string.  _wrapper.__doc__ =
>decorator.__doc__ before the return should probably do it.
>
>I don't think that automatically setting a __doc__ string on the result
>object is a good idea at all because it could cause unnecessary
>problems for some result objects (instances of a class, for example).

Probably a decorator could be written to facilitate writing
docstring- and other such info saving decorators...

def wrapwith(obj):
   @docsafe
   def decorator(f):
       def _wrapper(*args, **kwargs):
           print "##", obj
           return f(*args, **kwargs)
       return _wrapper
   return decorator



>-bob
>_______________________________________________
>Python-Dev mailing list
>Python-Dev at python.org
>http://mail.python.org/mailman/listinfo/python-dev
>Unsubscribe: http://mail.python.org/mailman/options/python-dev/rnd%40onego.ru
>

Sincerely yours, Roman Suzi
-- 
rnd at onego.ru =\= My AI powered by GNU/Linux RedHat 7.3


More information about the Python-Dev mailing list