【问题标题】:How can I use wrapt.decorator adapters to change the signature of unbound methods?如何使用 wrapt.decorator 适配器更改未绑定方法的签名?
【发布时间】:2020-02-13 02:03:49
【问题描述】:

下面是我尝试将MyClass.func 的签名从(self, a, b, c) 更改为(self, x, y, z) 的MWE。从输出中可以看出,change_sig 装饰器适用于函数,也适用于绑定方法 MyClass().func,但在未绑定方法上失败。当我将一个可调用属性分配给一个阻止它工作的类时,是否有某种魔法在幕后发生?

MWE:

import wrapt
import inspect

def change_sig(func):
    adapter = '(self, x, y, z)'
    @wrapt.decorator(adapter=adapter)
    def wrapper(wrapped, instance, args, kwargs):
        pass
    wrapped_func = wrapper(func)
    return wrapped_func

@change_sig
def func(self, a, b, c):
    pass

class MyClass:
    @change_sig
    def func(self, a, b, c):
        pass

print('inspect.signature(func):', inspect.signature(func))
print('inspect.signature(MyClass.func):', inspect.signature(MyClass.func))
print('inspect.signature(MyClass().func):', inspect.signature(MyClass().func))

print('inspect.signature(change_sig(MyClass.func)):', inspect.signature(change_sig(MyClass.func)))
MyClass.wrapped_func = change_sig(MyClass.func)
print('inspect.signature(MyClass.wrapped_func):', inspect.signature(MyClass.wrapped_func))

输出:

inspect.signature(func): (self, x, y, z)
inspect.signature(MyClass.func): (self, a, b, c)
inspect.signature(MyClass().func): (x, y, z)
inspect.signature(change_sig(MyClass.func)): (self, x, y, z)
inspect.signature(MyClass.wrapped_func): (self, a, b, c)

【问题讨论】:

    标签: python python-decorators method-signature wrapt


    【解决方案1】:

    这可追溯到 wrapt 中的一个错误,正在解决:https://github.com/GrahamDumpleton/wrapt/issues/148

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      相关资源
      最近更新 更多