有没有办法将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))
,但当然可能有遗留代码。
感谢
答案 0 :(得分:620)
myfun(*tuple)
完全您要求的内容。
附带问题:不用作标识符内置类型名称,例如tuple
,list
,file
,set
和所以 - 这是一种可怕的做法,会回来并在你最不期望的时候咬你,
所以要养成主动避免使用自己的标识隐藏内置名称的习惯。
答案 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))