首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用wrapt.decorator适配器更改未绑定方法的签名?

如何使用wrapt.decorator适配器更改未绑定方法的签名?
EN

Stack Overflow用户
提问于 2020-02-13 10:03:49
回答 1查看 74关注 0票数 0

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

MWE:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2020-02-14 00:57:37

这被追踪到wrapt中的一个bug,这个问题正在被解决:https://github.com/GrahamDumpleton/wrapt/issues/148

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60199457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档