Как передать несколько словарей и получить доступ к определенным значениям?

#python #python-3.x

#python #python-3.x

Вопрос:

Я пытаюсь сделать следующее на Python:

 dict1 = {
    'a': 2,
    'b': 3,
    'c': 5,
}

dict2 = {
    'd': 2,
    'e': 3,
}

def do_sum(**dict1, **dict2):
    print(dict1['a']   dict1['b']   dict2['d'])

do_sum(**dict1, **dict2)
  

Однако Python не позволяет мне передавать несколько **kwargs в функцию. Я тоже пытался это сделать, но ошибка:

 def do_sum(dict1, dict2):
        print(dict1.values('a')   dict1.values('b')   dict2.values('d'))

    do_sum(dict1, dict2)
  

Как можно выполнить операцию в функции? В принципе, я хочу передать несколько словарей, но хочу получить доступ только к определенным значениям в них.

Комментарии:

1. Это позволяет вам передавать несколько kwargs, но нет абсолютно никакого смысла получать несколько kwargs; как Python должен знать, какие ключи вы хотите в каком параметре? Кроме того, если вам нужны конкретные аргументы, вы могли бы def do_sum(a, b, d, **kwargs): извлечь только те, которые вам нужны, и все равно вызвать их do_sum(**dict1, **dict2) .

Ответ №1:

Вы могли бы просто передать сам словарь следующим образом:

 dict1 = {
    'a': 2,
    'b': 3,
    'c': 5,
}

dict2 = {
    'd': 2,
    'e': 3,
}

def do_sum(dict1, dict2):
    print(dict1['a']   dict1['b']   dict2['d'])

do_sum(dict1, dict2)
  

На самом деле это то же самое, что вы хотели сделать, ** просто разрушает словарь, а затем функция перестраивает его снова. Поэтому это также немного быстрее.
если вы действительно хотите создать свой стиль, вы могли бы использовать dict.update(), который объединяет 2 словаря. вот так:

 import copy

dict1 = {
    'a': 2,
    'b': 3,
    'c': 5,
}

dict2 = {
    'd': 2,
    'e': 3,
}


def do_sum(**dict3):
    print(dict3['a']   dict3['b']   dict3['d'])


dict3 = copy.copy(dict1)
dict3.update(dict2)

do_sum(**dict3)

  

Редактировать:
Как указал jonrsharpe, вам не нужно создавать dict3. Код будет выглядеть следующим образом:

 
dict1 = {
    'a': 2,
    'b': 3,
    'c': 5,
}

dict2 = {
    'd': 2,
    'e': 3,
}


def do_sum(**dict3):
    print(dict3['a']   dict3['b']   dict3['d'])


do_sum(**dict1, **dict2)

  

Комментарии:

1. Вам не обязательно создавать dict3 , Python позволяет распаковывать несколько словарей в одну функцию при ее вызове ( начиная с 3.5 ).

2. Вы совершенно правы. Глупо, что я не подумал об этом. Я добавлю третий раздел, чтобы сделать это по-вашему.