将元组扩展为参数

时间:2010-01-03 02:22:49

标签: python tuples argument-passing

有没有办法将Python元组扩展为函数 - 作为实际参数?

例如,expand()就是魔术:

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

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

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

我知道可以将myfun定义为myfun((a, b, c)),但当然可能有遗留代码。 感谢

6 个答案:

答案 0 :(得分:620)

myfun(*tuple) 完全您要求的内容。

附带问题:用作标识符内置类型名称,例如tuplelistfileset和所以 - 这是一种可怕的做法,回来并在你最不期望的时候咬你, 所以要养成主动避免使用自己的标识隐藏内置名称的习惯。

答案 1 :(得分:37)

请注意,您还可以展开参数列表的一部分:

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

答案 2 :(得分:14)

查看the Python tutorial第4.7.3和4.7.4节。 它讨论了将元组作为参数传递。

我还会考虑使用命名参数(并传递字典)而不是使用元组并传递序列。当位置不直观或有多个参数时,我发现使用位置参数是一种不好的做法。

答案 3 :(得分:8)

这是函数式编程方法。它提升了元组扩展功能的语法糖:

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

使用示例:

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'
从长远来看,apply_tuple partial重新定义了compile 'com.anthonymandra:ToggleButtons:2.0.0'次电话。

答案 4 :(得分:0)

我遇到了类似的问题并创建了这个扩展固定功能的功能。希望这会有所帮助。

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)

答案 5 :(得分:0)

类似于@Dominykas的答案,这是一个将多参数接受函数转换为元组接受函数的修饰器:

apply_tuple = lambda f: lambda args: f(*args)

示例1:

def add(a, b):
    return a + b

three = apply_tuple(add)((1, 2))

示例2:

@apply_tuple
def add(a, b):
    return a + b

three = add((1, 2))