У меня есть несколько функций, которые берут целую кучу тех же аргументов. У некоторых из них есть дополнительные аргументы. Я бы хотел передать один и тот же словарь в них, но те, у кого меньше аргументов, будут жаловаться на дополнительные элементы в словаре.
Какое лучшее решение? Поместить бесполезные фиктивные параметры в функции с меньшим количеством аргументов?
Сделайте простой декоратор, который будет использовать модуль inspect
для получения списка параметров функции. Это даст вам пример:
import inspect
def take_many_arguments(fn):
origf = fn
def _f(*arg, **args):
new_args = {}
for a in inspect.getargspec(origf).args:
if a not in args:
continue
new_args[a] = args[a]
return origf(*arg, **new_args)
return _f
class C:
@take_many_arguments
def fn1(self, a):
print(a)
@take_many_arguments
def fn2(self, a, b):
print(a, b)
@take_many_arguments
def fn3(self, a, b, c):
print(a, b, c)
@take_many_arguments
def fn4(a, b):
print(a, b)
d = {'a': 1, 'b': 2, 'c': 3}
# for classes:
c = C()
c.fn1('Normal call')
c.fn1(**d)
c.fn2(**d)
c.fn3(**d)
# for functions:
fn4(9, 8)
fn4(**d)
Выход:
Normal call
1
1 2
1 2 3
9 8
1 2
args[a]
завершится ошибкой для этого параметра (этот параметр находится внутриarg
). Так, например, если я хочу использовать это внутри класса, у меня будут проблемы с параметромself
. Единственный способ избежать этого - добавитьif not a == 'self'
между строкойfor a
строкойnew_args[a] =
. Ты так справишься?