访问原来的装饰功能,用于测试目的(Accessing original decorated func

2019-07-20 03:02发布

我使用一个装饰( @render_todjango_annoying视图中的功能包)。

但问题是,我想获得一个由视图功能用于测试目的返回原来的字典,而不是HttpResponse对象装饰的回报。

该装饰使用@wraps (从functools )。

如果没有办法进入这一点,那么你有如何测试这个任何想法?

Answer 1:

被包装的函数将作为一个功能封闭细胞。 这究竟细胞取决于有多少封变量有。

对于一个简单的包装,唯一的闭包变量是功能来换行,这将是第一个:

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

使自省,只是有点更容易。



文章来源: Accessing original decorated function for test purposes