[Python-Dev] Adding functools.decorator

Georg Brandl g.brandl at gmx.net
Sun Apr 30 17:23:53 CEST 2006


Nick Coghlan wrote:
> Collin Winters has done the work necessary to rename PEP 309's functional 
> module to functools and posted the details to SF [1].
>> I'd like to take that patch, tweak it so the C module is built as _functools 
> rather than functools, and then add a functools.py consisting of:

I'm all for it. (You could integrate the C version of "decorator" from my SF
patch, but I think Python-only is enough).
> from _functools import * # Pick up functools.partial
>> def _update_wrapper(decorated, func, deco_func):
> # Support naive introspection
> decorated.__module__ = func.__module__
> decorated.__name__ = func.__name__
> decorated.__doc__ = func.__doc__
> decorated.__dict__.update(func.__dict__)
> # Provide access to decorator and original function
> decorated.__decorator__ = deco_func
> decorated.__decorates__ = func
>> def decorator(deco_func):
> """Wrap a function as an introspection friendly decorator function"""
> def wrapper(func):
> decorated = deco_func(func)
> if decorated is func:
> return func
> _update_wrapper(decorated, func, deco_func)
> return decorated
> # Manually make this decorator introspection friendly
> _update_wrapper(wrapper, deco_func, decorator)
> return wrapper
>> After typing those four lines of boilerplate to support naive introspection 
> out in full several times for contextlib related decorators, I can testify 
> that doing it by hand gets old really fast :)

Agreed.
Georg


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /