Как я могу распаковать кортеж, когда нужны другие переменные? - PullRequest
0 голосов
/ 18 декабря 2018

Согласно this , я могу вызвать функцию, которая принимает N аргументов с кортежем, содержащим эти аргументы, с f(*my_tuple).

Есть ли способ объединить распакованные и распакованные переменные?

Что-то вроде:

def f(x,y,z):...
a = (1,2)
f(*a, 3)

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

как сказал @pault - вы можете создать новый кортеж и сделать еще одну вещь:

передать *a как переменную last в функцию, дляпример:

def f(x,y,z):...
a = (1,2)
f(3, *a)

работал для меня в Python 2.7

0 голосов
/ 18 декабря 2018

Немного тяжело, но вы можете использовать functools.partial, чтобы частично применить f к аргументам в a перед вызовом получившегося вызова на 3.

from functools import partial

partial(f, *a)(3)

Это более полезно, если вызапланировать много вызовов f с теми же двумя аргументами из a, но с разными третьими аргументами;например:

a = (1,2)
g = partial(f, *a)
for k in some_list:
    g(k)  # Same as f(1,2,k)
0 голосов
/ 18 декабря 2018

Указанный вами код (f(*a, 3)) действителен для Python 3. Для Python 2 вы можете создать новый кортеж, добавив дополнительные значения.Затем распакуйте новый кортеж.

Например, если у вас была следующая функция f:

def f(x, y, z):
    return x*y - y*z

print(f(1,2,3))
#-4

Попытка вашего кода приводит к ошибке в Python 2:

a = (1,2)
print(f(*a,3))
#SyntaxError: only named arguments may follow *expression

Так что просто создайте новый tuple:

new_a = a + (3,)
print(f(*new_a))
#-4

Обновление

Я также должен добавить еще один вариант - передать именованный аргумент после выражения * (как указано в SyntaxError):

print(f(*a, z=3))
#-4
...