#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. Вы совершенно правы. Глупо, что я не подумал об этом. Я добавлю третий раздел, чтобы сделать это по-вашему.