python - 如何从 Python 中的函数中去除装饰器

标签 python decorator

假设我有以下内容:

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/

相关文章:

python - Python 中类装饰的实际用途是什么?

python - 如何在python中使用子进程模块

python - 尝试为回合制游戏创建重播功能(非常新手)

c# - 如何从外到内用 Ninject 绑定(bind)装饰器?

java - 带有装饰器的设计模式

Python设计问题(在这种情况下可以/应该使用装饰器吗?)

python - 以 root 身份在 Eclipse 中运行 Python 项目

python - 将 None 对象属性打印为空字符串

python - 无法读取 DBF 文件(dbf 库)

java - 在 mysql 数据库表中反射(reflect)装饰器模式