Это то, что вы хотите?
def func(**kwargs):
for key, value in kwargs.items():
pass # Do something
func(**myDict) # Call func with the given dict as key/value parameters
(Подробнее о аргументах ключевых слов см. В документации . Ключи в myDict
должны быть строками.)
Редактировать : вы отредактировали свой вопрос, включив в него следующее:
Я думаю, что запись ** перед myDict указывает функции ожидать словарь и распаковывать ключ (первый *) и значение, второй *
Это не правильно. Чтобы понять, что происходит, необходимо учитывать следующее:
- Функция может иметь несколько формальных параметров (
a
и b
в этом случае):
def f1(a, b): pass
- Мы можем передать позиционные аргументы такой функции (как в большинстве других языков):
f1(2, 3)
- Мы также можем передать аргументы ключевых слов :
f1(a=2, b=3)
- Мы также можем смешать их, , но позиционные аргументы должны стоять первыми :
f1(2, b=3)
f1(a=2, 3) # SyntaxError: non-keyword arg after keyword arg
- Существует способ разрешить функции принимать произвольное количество позиционных аргументов, к которому она может обращаться как кортеж (
args
в этом случае):
def f2(*args): assert isinstance(args, tuple)
- Теперь мы можем вызывать
f2
, используя отдельно указанные аргументы, или используя список, содержимое которого сначала должно быть распаковано , используя синтаксис, аналогичный обозначению, используемому для *args
:
f2(2, 3)
f2(*[2, 3])
- Аналогично, может быть принято произвольное количество аргументов ключевого слова:
def f3(**kwargs): pass
- Обратите внимание, что
f3
не запрашивает один аргумент типа dict
. Это ожидаемые вызовы:
f3(a=2, b=3)
f3(**{'a': 2, 'b': 3})
- Все аргументы
f3
должны быть названы:
f3(2, 3) # TypeError: f3() takes exactly 0 arguments (2 given)
Собрав все это вместе и помня, что позиционные аргументы должны стоять первыми, мы можем иметь:
>>> def f4(a, b, *args, **kwargs):
... print('%r, %r' % (args, kwargs))
...
>>> f4(2, 3)
(), {}
>>> f4(2, 3, 4, 5)
(4, 5), {}
>>> f4(2, 3, x=4, y=5)
(), {'y': 5, 'x': 4}
>>> f4(2, 3, 4, 5, x=6, y=7)
(4, 5), {'y': 7, 'x': 6}
>>> f4(2, *[3, 4, 5], **{'x': 6, 'y': 7})
(4, 5), {'y': 7, 'x': 6}
Обратите особое внимание на следующие две ошибки:
>>> f4(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f4() takes at least 2 arguments (1 given)
>>> f4(2, 3, a=4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f4() got multiple values for keyword argument 'a'
Вторая ошибка должна помочь вам объяснить это поведение:
>>> f4(**{'foo': 0, 'a': 2, 'b': 3, 'c': 4})
(), {'c': 4, 'foo': 0}