Как я могу использовать адаптеры wrapt.decorator для изменения сигнатуры несвязанных методов? - PullRequest
0 голосов
/ 13 февраля 2020

Ниже приведен MWE моей попытки изменить подпись MyClass.func с (self, a, b, c) на (self, x, y, z). Как видно из выходных данных, декоратор change_sig работает с функциями, а также с привязанным методом MyClass().func, но не работает с несвязанным методом. Есть ли какая-то магия c, которая происходит за кулисами, когда я назначаю вызываемый атрибут классу, который не позволяет этому работать?

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)

1 Ответ

0 голосов
/ 13 февраля 2020

Это связано с ошибкой в ​​wrapt, к которой обращаются: https://github.com/GrahamDumpleton/wrapt/issues/148

...