python: передача в функции параметров в виде словаря и добавление своих значений

Рейтинг: 0Ответов: 3Опубликовано: 18.05.2023

подскажите как компактно, красиво и корректно передать в функцию параметры, содержащиеся в словаре + добавить свои параметры

если над просто передать значения, то проблем нет:

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}

а какой-нибудь короткий и красивый аналог в питоне есть?

Ответы

▲ 4Принят

Можете просто добавить именованный аргумент перед словарем **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}
▲ 1

Словари можно распаковывать так:

>>> 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)

▲ 1

Словари можно объединять оператором |:

>>> 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))  # распаковываем результат операции