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.