web-dev-qa-db-fra.com

Développer des nuplets en arguments

Existe-t-il un moyen de développer un tuple Python dans une fonction - en tant que paramètres réels?

Par exemple, ici expand() fait la magie:

Tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(Tuple)) # (2, "foobar", "barfoo")

Je sais que l'on pourrait définir myfun comme myfun((a, b, c)), mais bien sûr, il peut y avoir du code hérité ..__

308
AkiRoss

myfun(*Tuple) fait exactement ce que vous demandez.

Problème secondaire: ne pas utiliser comme identifiant des noms de types tels que Tuple, list, file, set, etc. - - c’est une pratique horrible et il reviendra et vous mordra au moment où vous vous y attendrez le moins, prenez donc l’habitude de prendre une part active en évitant de cacher des noms internes avec vos propres identifiants.

651
Alex Martelli

Notez que vous pouvez également développer une partie de la liste d'arguments:

myfun(1, *("foo", "bar"))
34
Valentas

Jetez un coup d’œil à le tutoriel sur Python sections 4.7.3 et 4.7.4 .

J'envisagerais également d'utiliser des paramètres nommés (et de passer un dictionnaire) au lieu d'utiliser un tuple et de passer une séquence. Je trouve que l’utilisation d’arguments de position est une mauvaise pratique lorsque les positions ne sont pas intuitives ou qu’il existe plusieurs paramètres. 

13
Uri

J'ai rencontré un problème similaire et créé cette fonction qui étend la fonction fixe. J'espère que cela t'aides.

def run_argtup(func, argvalues):
    """
    Execute any functions with their arguments in Tuple.

    :param func:
    :param argvalues:
    :return:
    """
    argnames = get_func_argnames(func)
    if len(argnames) != len(argvalues):
        raise ValueError("Length of args doens't match.")
    for argn, argv in Zip(argnames, argvalues):
        exec('{}=argv'.format(argn))
    return eval('func(%s, %s)' % argnames)
0
Gabriel_F