代码之家  ›  专栏  ›  技术社区  ›  AkiRoss

将元组扩展为参数

  •  318
  • AkiRoss  · 技术社区  · 16 年前

    有没有方法将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)) 但是,当然可能有遗留代码。 谢谢

    5 回复  |  直到 8 年前
        1
  •  595
  •   Jonathan Wakely    8 年前

    myfun(*tuple) 确切地 你的要求。

    侧重点: 不要 用作内置类型名的标识符,例如 tuple , list , file , set 等等——这是可怕的练习 当你最不经意的时候回来咬你, 所以只要养成积极主动的习惯 避免 用自己的标识符隐藏内置名称。

        2
  •  34
  •   Valentas    11 年前

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

    myfun(1, *("foo", "bar"))
    
        3
  •  13
  •   Kellen Donohue Uri    8 年前

    看一看 the Python tutorial 第4.7.3和4.7.4节。 它谈到将元组作为参数传递。

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

        4
  •  6
  •   Dominykas Mostauskis    9 年前

    这是函数式编程方法。它将元组扩展功能从语法sugar中提出来:

    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'
    

    curry 重新定义 apply_tuple 节省了很多 partial 从长远来看。

        5
  •  0
  •   Gabriel_F    8 年前

    我遇到了类似的问题,创建了这个函数来扩展固定函数。希望这有帮助。

    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)