Основная проблема заключается в том, что при объявлении функции с помощью (*args, **kwargs)
нет внутреннего упорядочивания до foo
и bar
, если мы позже не наложим его в теле функции. Но мы могли бы сделать что-то вроде этого:
def my_func(*args, **kwargs):
# we didn't say in the declaration what the arguments
# were meant to be, but now we want to impose an
# interpretation on the args,
params = ["foo", "bar"]
argsd = dict(zip(params, args))
# and fold in the kwargs
argsd.update(kwargs)
# unpack into variables, choosing names based on the
# params that we are using (this rather assumes that
# the params list has been hard-coded because we wouldn't
# want to try naming the local variables dynamically)
foo, bar = [argsd[k] for k in params]
print(f"foo={foo}, bar={bar}, args={args}, kwargs={kwargs}")
my_func(1, 2)
my_func(1, bar=2)
my_func(foo=1, bar=2)
my_func(bar=2, foo=1)
Вывод:
foo=1, bar=2, args=(1, 2), kwargs={}
foo=1, bar=2, args=(1,), kwargs={'bar': 2}
foo=1, bar=2, args=(), kwargs={'foo': 1, 'bar': 2}
foo=1, bar=2, args=(), kwargs={'bar': 2, 'foo': 1}