Python, аргументы кортежа, красиво играющие с другими - PullRequest
4 голосов
/ 29 марта 2011

Например:

mytuple = ("Hello","World")
def printstuff(one,two,three):
    print one,two,three

printstuff(mytuple," How are you")

Это естественно вылетает с TypeError, потому что я даю ему только два аргумента, когда он ожидает три.

Есть ли простой способ эффективно «разделить» кортеж более сложным способом, чем расширение всего? Как:

printstuff(mytuple[0],mytuple[1]," How are you")

Ответы [ 6 ]

6 голосов
/ 29 марта 2011

Kinda, ... вы можете сделать это:

>>> def fun(a, b, c):
...     print(a, b, c)
...
>>> fun(*(1, 2), 3)
  File "<stdin>", line 1
SyntaxError: only named arguments may follow *expression
>>> fun(*(1, 2), c=3)
1 2 3

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

4 голосов
/ 29 марта 2011

Не без изменения порядка аргументов или переключения на именованные параметры.

Вот альтернатива именованных параметров.

printstuff( *mytuple, three=" How are you" )

Вот альтернатива переключения порядка.

def printstuff( three, one, two ):
    print one, two, three

printstuff( " How are you", *mytuple )

Что может быть довольно ужасно.

3 голосов
/ 29 марта 2011

Попробуйте следующее:

printstuff(*(mytuple[0:2]+(" how are you",)))
1 голос
/ 05 мая 2012
mytuple = ("Hello","World")

def targs(tuple, *args):
    return tuple + args

def printstuff(one,two,three):
    print one,two,three 

printstuff(*targs(mytuple, " How are you"))
Hello World  How are you
0 голосов
/ 05 июня 2017

На самом деле, это можно сделать без изменения порядка аргументов.Сначала вы должны преобразовать вашу строку в кортеж, добавить ее в свой кортеж mytuple и затем передать свой больший кортеж в качестве аргумента.

printstuff(*(mytuple+(" How are you",)))
# With your example, it returns: "Hello World  How are you"
0 голосов
/ 29 марта 2011

Вы можете попробовать:

def printstuff(*args):
    print args

Другой вариант - использовать новый тип коллекций namedtuple .

...