[Python-Dev] Adding functools.decorator

Nick Coghlan ncoghlan at iinet.net.au
Sun Apr 30 15:56:19 CEST 2006


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:
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 :)
Some details that are up for discussion:
 - which of a function's special attributes should be copied/updated?
 - should the __decorates__ and __decorator__ attributes be added?
If people are happy with this idea, I can make sure it happens before alpha 3.
Cheers,
Nick.
[1] http://www.python.org/sf/1478788
-- 
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
 http://www.boredomandlaziness.org


More information about the Python-Dev mailing list

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