我使用一个装饰( @render_to
从django_annoying
视图中的功能包)。
但问题是,我想获得一个由视图功能用于测试目的返回原来的字典,而不是HttpResponse
对象装饰的回报。
该装饰使用@wraps
(从functools
)。
如果没有办法进入这一点,那么你有如何测试这个任何想法?
我使用一个装饰( @render_to
从django_annoying
视图中的功能包)。
但问题是,我想获得一个由视图功能用于测试目的返回原来的字典,而不是HttpResponse
对象装饰的回报。
该装饰使用@wraps
(从functools
)。
如果没有办法进入这一点,那么你有如何测试这个任何想法?
被包装的函数将作为一个功能封闭细胞。 这究竟细胞取决于有多少封变量有。
对于一个简单的包装,唯一的闭包变量是功能来换行,这将是第一个:
wrapped = decorated.func_closure[0].cell_contents
但你可能要检查所有的func_closure
值。
演示使用functools.wraps()
例如装饰 :
>>> from functools import wraps
>>> def my_decorator(f):
... @wraps(f)
... def wrapper(*args, **kwds):
... print 'Calling decorated function'
... return f(*args, **kwds)
... return wrapper
...
>>> @my_decorator
... def example():
... """Docstring"""
... print 'Called example function'
...
>>> example
<function example at 0x107ddfaa0>
>>> example.func_closure
(<cell at 0x107de3d70: function object at 0x107dc3b18>,)
>>> example.func_closure[0].cell_contents
<function example at 0x107dc3b18>
>>> example()
Calling decorated function
Called example function
>>> example.func_closure[0].cell_contents()
Called example function
纵观源代码@render_to
你不担心这虽然; 被包装的功能将被存储在第一关闭部狭槽,保证。
如果这是Python 3中代替地,包装的函数可以与被访问__wrapped__
属性代替:
>>> example.__wrapped__
<function example at 0x103329050>
如果你有机会访问装饰代码本身,你可以轻松地添加在Python参考同2码太:
def my_decorator(f):
@wraps(f)
def wrapper(*args, **kwds):
# implementation
wrapper.__wrapped__ = f
return wrapper
使自省,只是有点更容易。