假设我有以下内容:
def with_connection(f):
def decorated(*args, **kwargs):
f(get_connection(...), *args, **kwargs)
return decorated
@with_connection
def spam(connection):
# Do something
我想测试 spam
功能,而无需经历设置连接(或装饰器正在做的任何事情)的麻烦。
给定 spam
,我如何从中剥离装饰器并获得底层的“未装饰”功能?
最佳答案
这个问题有一些更新。如果您使用的是 Python 3,并且 @functools.wraps
您可以使用 __wrapped__
属性作为来自 stdlib 的装饰器。
这是来自 Python Cookbook, 3rd edition, section 9.3 Unwrapping decorators 的示例
>>> @somedecorator
>>> def add(x, y):
... return x + y
...
>>> orig_add = add.__wrapped__
>>> orig_add(3, 4)
7
>>>
如果你试图从自定义装饰器中解包一个函数,装饰器函数需要使用 functools
中的 wraps
函数参见 Python Cookbook, 3rd edition, section 9.2 Preserving function metadata when writing decorators 中的讨论
>>> from functools import wraps
>>> def somedecorator(func):
... @wraps(func)
... def wrapper(*args, **kwargs):
... # decorator implementation here
... # ......
... return func(*args, **kwargs)
...
... return wrapper
关于python - 如何从 Python 中的函数中去除装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1166118/