Сообщить об ошибке.

Распаковка аргументов для передачи в функцию Python

Бывают ситуации, когда для функции, требующей отдельных позиционных аргументов, значения этих аргументов уже находятся в списке или кортеже, и для вызова функции должны быть распакованы.

Например, встроенная range() функция ожидает отдельные аргументы start и stop. Если они не доступны отдельно, то можно распаковать аргументы из списка list или кортежа tuple, вызвав функцию с переменной этого списка/кортежа, а впереди нее поставить символ одной звездочки *:

# обычный вызов с отдельными аргументами
>>> list(range(3, 6))
# [3, 4, 5]

>>> args = [3, 6]
# вызов с аргументами, распакованными из списка
>>> list(range(*args))  
# [3, 4, 5]

Таким же образом, из словаря dict в функцию можно передать ключевые аргументы, только в этом случае, перед переменной словаря ставится два символов звездочки **:

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print("-- This parrot wouldn't", action, end=' ')
...     print("if you put", voltage, "volts through it.", end=' ')
...     print("E's", state, "!")
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
# -- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demis

Следует запомнить:

  • символом * - распаковывают последовательности в качестве элементов которых одно значение (списки, кортежи, множества)
  • два символа ** - распаковывают последовательности в качестве элементов которых имеется ключ и значение (словари)

Примеры распаковки списков и словарей с аргументами для функции:

date_inf = {'year': "2020", 'month': "12", 'day': "06"}
f_name = "{year}-{month}-{day}.txt".format(**date_inf)
print(f_name)
# 2020-12-06.txt


fruits = ['lemon', 'orange', 'banana', 'tomato']
print(*fruits)
# lemon orange banana tomato

Распаковку аргументов можно использовать несколько раз в функции:

date_info = {'year': "2020", 'month': "01", 'day': "01"}
track_info = {'artist': "Beethoven", 'title': 'Symphony No 5'}
filename = "{year}-{month}-{day}-{artist}-{title}.txt".format(**date_info, **track_info)
print(filename)
# 2020-01-01-Beethoven-Symphony No 5.txt

Распаковка итерируемых объектов в переменные:

fruits = ['lemon', 'orange', 'banana', 'tomato']

first, second, *orher = fruits
print(orher)
# ['banana', 'tomato']

first, *orher = fruits
print(orher)
# ['orange', 'banana', 'tomato']

first, *middle, last = fruits
print(middle)
# ['orange', 'banana']