Aki*_*oss 375 python tuples parameter-passing
有没有办法将Python元组扩展为函数 - 作为实际参数?
例如,这里expand()有魔力:
some_tuple = (1, "foo", "bar")
def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)
myfun(expand(some_tuple)) # (2, "foobar", "barfoo")
我知道可以定义myfun为myfun((a, b, c)),但当然可能有遗留代码.谢谢
Ale*_*lli 688
myfun(*tuple)不正是你要求什么.
侧问题:不要为你的标识符内建类型的名称,如使用*,tuple,list,file,等等-这是可怕的做法,它会回来,咬你的时候,你最不经意的时候,所以只是进入的积极的习惯,避免使用您自己的标识符隐藏内置名称.
Val*_*tas 46
请注意,您还可以展开参数列表的一部分:
myfun(1, *("foo", "bar"))
这是函数式编程方法.它提升了元组扩展功能的语法糖:
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 redefiniton apply_tuple可以节省很多partial电话.
与@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))