假设我有以下内容:

def with_connection(f):
    def decorated(*args, **kwargs):
        f(get_connection(...), *args, **kwargs)
    return decorated

@with_connection
def spam(connection):
    # Do something

我想测试 spam 函数,而无需经历设置连接的麻烦(或装饰器正在做的任何事情)。

给定 spam ,如何从中剥离装饰器并获得底层的“未装饰”功能?

最佳答案

在一般情况下,你不能,因为

@with_connection
def spam(connection):
    # Do something

相当于
def spam(connection):
    # Do something

spam = with_connection(spam)

这意味着“原始”垃圾邮件甚至可能不再存在。一个(不太漂亮的)hack 是这样的:
def with_connection(f):
    def decorated(*args, **kwargs):
        f(get_connection(...), *args, **kwargs)
    decorated._original = f
    return decorated

@with_connection
def spam(connection):
    # Do something

spam._original(testcon) # calls the undecorated function

关于python - 如何从 Python 中的函数中去除装饰器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1166118/

10-15 22:30