Pregunta

¿Hay una manera de ampliar una tupla de Python en una función - como parámetros actuales

?

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 se podría definir como myfun myfun((a, b, c)), pero por supuesto no puede ser código heredado. Gracias

¿Fue útil?

Solución

myfun(*tuple) hace exactamente lo que solicite.

cuestión secundaria: No utilizar como identificadores incorporados nombres de tipos, tales como tuple, list, file, set, y así sucesivamente - es horrible práctica y volver y morder cuando menos te lo esperas, por lo que acaba de entrar en el hábito de forma activa evitar escondite incorporado nombres con sus propios identificadores.

Otros consejos

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

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

Tome un vistazo a la Guía de aprendizaje de la sección 4.7.3 y 4.7.4. Se habla de pasar tuplas como argumentos.

También me gustaría considerar el uso de parámetros con nombre (y pasando un diccionario) en lugar de utilizar una tupla y pasando una secuencia. Me parece que el uso de argumentos posicionales que sea una mala práctica cuando las posiciones no son intuitivos o hay múltiples parámetros.

Este es el método de programación funcional. Se levanta la característica de expansión tupla de azúcar en la 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'

de curry redefiniton de apply_tuple ahorra mucho partial llamadas en el largo plazo.

Me encontré con un problema similar y creé esta función que amplían 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top