Я пытаюсь написать декоратор, который будет делать некоторые действия на основе kwargs, пока я хочу сохранить подпись функций одновременно.Как разрешить параметры для декоратора, одновременно сохраняя подпись функции?
Вот тест блок я хочу передать:
def test_test_deprecator(self):
@test_deprecator("here is decorator message", 'z'):
def some_method(x, y, z):
return x + y
self.assertEqual(some_method(2, 2, z=6), 4)
# test the original function's signature
argspec = inspect.getargspec(some_method)
self.assertEqual(argspec.args, ["x", "y", "z"])
я написал что-то вроде:
import decorator
def test_decorator(message, args_name):
@decorator.decorator
def _test_docorator(f, *args, **kwargs):
if args_name in kwargs:
print(message)
return f(*args, **kwargs)
return _test_docorator
Испытательное устройство может пройти, но не выдает сообщение, потому что kwargs
всегда пустой.
Кто-нибудь знает, как этого достичь?
Я хочу, чтобы сохранить функцию подписи , что означает, что когда я использую «argspec = inspect.getargspec (fn)», он получает аргументы для fn. –
Извините, я лучше понимаю, как некоторые детали вокруг декораторов, так и то, что вы спрашивали сейчас. Я обновил свой ответ. – Turn
Нет, это не работает. с @ wrapt.decorator, kwargs по-прежнему пуст, а args становятся dict, это даже вызывает ошибку при запуске f (* args, ** kwargs). –