que propias procedimientos por parametros opcionales omision linea funciones comando argumentos python tuples argument-passing

python - propias - Expandiendo tuplas en argumentos



python class kwargs (5)

¿Hay una manera de expandir una tupla de Python en una función, como parámetros reales?

Por ejemplo, aquí expand() hace la magia:

tuple = (1, "foo", "bar") def myfun(number, str1, str2): return (number * 2, str1 + str2, str2 + str1) myfun(expand(tuple)) # (2, "foobar", "barfoo")

Sé que uno podría definir myfun como myfun((a, b, c)) , pero por supuesto puede haber un código heredado. Gracias


Eche un vistazo a los tutoriales de Python, sección 4.7.3 y 4.7.4. Habla de pasar tuplas como argumentos.

También consideraría usar parámetros con nombre (y pasar un diccionario) en lugar de usar una tupla y pasar una secuencia. Considero que el uso de argumentos posicionales es una mala práctica cuando las posiciones no son intuitivas o hay múltiples parámetros.


Este es el método de programación funcional. Levanta la característica de expansión de la tupla del azúcar de sintaxis:

apply_tuple = lambda f, t: f(*t)

Ejemplo de uso:

from toolz import * from operator import add, eq apply_tuple = curry(apply_tuple) thread_last( [(1,2), (3,4)], (map, apply_tuple(add)), list, (eq, [3, 7]) ) # Prints ''True''

curry redefinición de curry de apply_tuple ahorra muchas llamadas partial a largo plazo.


Me encontré con un problema similar y creé esta función que amplía la función fija. Espero que esto ayude.

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)


Tenga en cuenta que también puede expandir parte de la lista de argumentos:

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


myfun(*tuple) hace exactamente lo que solicitas.

Cuestión secundaria: no utilice como identificadores los nombres de tipo integrados como tuple , list , file , set , etc. - es una práctica horrible y volverá y lo morderá cuando menos lo espere, así que simplemente entre en el hábito de evitar activamente ocultar nombres incorporados con sus propios identificadores.