Opened 17 years ago
Last modified 17 years ago
#5701 closed
Fix naive introspection when using Django decorators — at Version 2
Reported by: | Jeremy Dunck | Owned by: | nobody |
---|---|---|---|
Component: | Uncategorized | Version: | dev |
Severity: | Keywords: | decorators views | |
Cc: | simon@… | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
It's fairly well-known that decorators are useful, but raise some issues.
Example:
def decorate(f): def wrap(*args, **kwargs): print "called" return f(*args, **kwargs) return wrap @decorate def add_to(augend, addend): "Adds stuff" return augend + addend
Introspecting add_to, undecorated, would have a __name__
of 'add_to'
and __doc__
of 'Adds stuff'.
After decorating, add_to.__name__
becomes 'wrap' and __doc__
becomes None.
================
In Python 2.5+, there's functools.wraps
, which takes care of the
problem of introspection on decorated functions by copying attributes
from the wrapped function.
http://docs.python.org/lib/module-functools.html
Django already includes curry
, which is roughly the same as
functools.partial
, so it's pretty easy to implement functools.wraps
.
The attached patch implements django.utils.functional.wraps
, updates all Django decorators to use it, and includes tests to verify that the fixing-up works.
Change History (3)
by , 17 years ago
Attachment: | dj-functools-decorators.diff added |
---|
comment:1 by , 17 years ago
Description: | modified (diff) |
---|
comment:2 by , 17 years ago
Description: | modified (diff) |
---|---|
Triage Stage: | Unreviewed → Accepted |
fixed description formatting.
patch against 6454