Простой подход заключается в том, чтобы ваша log_to_system
функция принимала переменные параметры и переменные ключевые слова в дополнение к известным параметрам, которые она будет фактически регистрировать, так что вы можете просто передать переменные аргументы и переменные ключевые слова аргументы из декорированногоназначить log_to_system
и позволить интерпретатору извлечь параметры a
, b
, c
и d
для вас:
def log_to_system(a, b, c, d, *args, **kwargs):
print(a, b, c, d)
def decorator(func):
def new_func(*args, **kwargs):
log_to_system(*args, **kwargs)
return func(*args, **kwargs)
return new_func
@decorator
def func(a, b, c, d, e):
pass
func(1, 2, c=3, d=4, e=5)
Это выводит:
1 2 3 4
В качестве альтернативы вы можете использовать inspect.signature
для получения набора аргументов после привязки заданных переменных-аргументов и аргументов ключевого слова к сигнатуре оформленной функции, так что вы можете вызывать log_to_system
только с необходимыми параметрами:
import inspect
def log_to_system(a, b, c, d):
print(a, b, c, d)
def decorator(func):
sig = inspect.signature(func)
def new_func(*args, **kwargs):
arguments = sig.bind(*args, **kwargs).arguments
log_to_system(**{k: arguments[k] for k in log_to_system.__code__.co_varnames})
return func(*args, **kwargs)
return new_func
@decorator
def func(a, b, c, d, e):
pass
func(1, 2, c=3, d=4, e=5)
Это выводит:
1 2 3 4