Как написать декоратор, чтобы декорированные функции могли принимать (и игнорировать) произвольные аргументы?Декоратор, позволяющий функции принимать произвольные аргументы
У меня есть некоторые функции, как это:
def foo(x):
return x
def foo2(x, y):
if bar(y):
return x
else:
return x + 1
def foo3(x, y, z):
...
foo()
можно вычислить возвращаемое значение для данного x
только на основе x
, но foo2()
нужен еще один параметр, и foo3()
нужен третий параметр. У меня есть метод в другом месте, который, между прочим, вызывает либо foo()
, foo2()
, и т. Д. В зависимости от заданного пользователем аргумента.
Сейчас метод просто захватывает соответствующую функцию с getattr(user_arg)
и называет его со всеми x
, y
, z
. Чтобы избежать TypeError за неверное число аргументов, то foo
функции все определены с *args
, как это:
def foo(x, *args):
return x
Но я хотел бы просто декоратора, чтобы избежать включения *args
в каждом определении foo
функции. Есть ли способ сделать это? Или вы можете предложить лучший способ организовать этот код?
Одним из способов было бы написать метод, как это:
if user_arg == 'foo':
foo(x)
elif user_arg == 'foo2':
foo2(x, y)
elif user_arg == 'foo3':
foo3(x, y, z)
Но я бы очень хотел, чтобы избежать этого, потому что есть много foo
функций, и потому что я хотел бы сделать это можно добавить новые функции foo
, не добавляя еще одну ветвь к методу.
Редактировать: Для того, чтобы уточнить, что это не тот случай, когда мне нужно вызвать другую функцию foo
основанную на число аргументов. Это произвольная (заданная пользователем) функция из foo
функций.
def foo3(x, y, z):
return x + y + z
def foo4(x, y, z):
return x + y - z
Образец, который вы описываете (отправка по количеству аргументов), не имеет ничего общего с декораторами. – alfasin
Есть ли у вас предложения? – user2034412
Как '@somedecorator def foo (x)' быть проще, чем 'def foo (x, * args)'? – chepner