python: передача в функции параметров в виде словаря и добавление своих значений
подскажите как компактно, красиво и корректно передать в функцию параметры, содержащиеся в словаре + добавить свои параметры
если над просто передать значения, то проблем нет:
data = {
'v1': 123,
'v3': 3.1415,
'v2': 'abc'
}
def func(v1, v2, v3):
print(v1, v2, v3, sep='\n')
func(**data)
а как быть, если я хочу заменить одно значение другим или добавить новое?
в JavaScript можно делать так:
{...data, v1: 987}
а какой-нибудь короткий и красивый аналог в питоне есть?
Ответы (3 шт):
Можете просто добавить именованный аргумент перед словарем **kwargs:
kw = {"a":1, "b":2}
def myfunc(**kwargs):
print(kwargs)
myfunc(**kw)
# {'a': 1, 'b': 2}
myfunc(c=3, **kw)
# {'c': 3, 'a': 1, 'b': 2}
mydict = {"e":4, "f":5}
myfunc(**mydict, **kw)
# {'e': 4, 'f': 5, 'a': 1, 'b': 2}
для замены значения можно так:
myfunc(**dict(kw, a=100))
# {'a': 100, 'b': 2}
Словари можно распаковывать так:
>>> d = {'a': 1, 'b': 2}
>>> {**d, 'c': 3} # Распаковка внутрь другого словаря
{'a': 1, 'b': 2, 'c': 3}
>>>
Соответственно, в вашем коде можно сделать так:
data = {
'v1': 123,
'v3': 3.1415,
'v2': 'abc'
}
def func(**vs):
print(vs)
func(**{**data, 'v4': 456})
(Этот вариант ближе всего к приведённому в вопросе способу на JavaScript)
Словари можно объединять оператором |:
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'c': 3, 'd': 4}
>>> d1 | d2
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
Соответственно, в вашем случае можно сделать так:
data = {
'v1': 123,
'v3': 3.1415,
'v2': 'abc'
}
additional = {
'v4': 456
}
def func(**vs):
print(vs)
func(**(data | additional)) # распаковываем результат операции