Как я могу взорвать кортеж, чтобы он мог быть передан в виде списка параметров? - PullRequest
20 голосов
/ 07 июля 2010

Допустим, у меня есть определение метода, подобное этому:

def myMethod(a, b, c, d, e)

Тогда у меня есть переменная и кортеж, подобный этому:

myVariable = 1
myTuple = (2, 3, 4, 5)

Есть ли способ, которым я могу передать разнесение кортежа, чтобы я мог передать его члены в качестве параметров? Примерно так (хотя я знаю, что это не сработает, так как весь кортеж считается вторым параметром):

myMethod(myVariable, myTuple)

Я бы хотел, если возможно, избегать ссылки на каждого члена кортежа ...

Ответы [ 2 ]

37 голосов
/ 07 июля 2010

Вы ищете аргумент для распаковки оператор *:

myMethod(myVariable, *myTuple)
7 голосов
/ 07 июля 2010

Из документации Python :

Обратная ситуация возникает, когда аргументы уже в списке или кортеж, но нужно распаковать для вызов функции требует отдельного позиционные аргументы. Например, встроенная функция range () ожидает отдельные аргументы start и stop Если они не доступны отдельно, написать вызов функции с * -оператор для распаковки аргументов из списка или кортежа:

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]

Точно так же словари могут доставить ключевые аргументы с ** - оператор:

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     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' demised !
...