我有两个Python函数,它们都在函数定义中使用变量参数。举一个简单的例子:
def func1(*args):
for arg in args:
print arg
def func2(*args):
return [2 * arg for arg in args]
我想撰写它们 - 就像在func1(func2(3, 4, 5))
中一样 - 但我不希望args
中的func1
为([6, 7, 8],)
,我希望它是(6, 7, 8)
,好像它被称为func1(6, 7, 8)
而不是func1([6, 7, 8])
。
通常情况下,我会使用func1(*func2(3, 4, 5))
或func1
检查args[0]
是否为列表。不幸的是,我不能在这个特定的实例中使用第一个解决方案而应用第二个解决方案需要在很多地方进行这样的检查(func1
的角色中有很多功能。)
有人知道怎么做吗?我想可以使用某种内省,但我可能是错的。
答案 0 :(得分:4)
你可以考虑编写函数修饰器来检查第一个参数是否是一个列表。将装饰器应用于现有函数比修改函数要简单一些。
答案 1 :(得分:3)
您可以使用Yaroslav发布的装饰器。
最小例子:
def unpack_args(func):
def deco_func(*args):
if isinstance(args, tuple):
args = args[0]
return func(*args)
return deco_func
def func1(*args):
return args
def func2(*args):
return args
@unpack_args
def func3(*args):
return args
print func1(1,2,3) # > (1,2,3)
print func2(1,2,3) # > (1,2,3)
print func1(*func2(1,2,3)) # > (1,2,3)
print func1(func2(1,2,3)) # > ( (1,2,3), )
print func3(func2(1,2,3)) # > (1,2,3)
答案 2 :(得分:1)
通常,我只会使用
func1(*func2(3, 4, 5))
或使用func1检查args[0]
是否为list
。不幸的是,我不能在这个特定的实例中使用第一个解决方案而应用第二个解决方案需要在很多地方进行这样的检查(func1
的角色中有很多功能。)
为什么不能使用第一个解决方案?
>>> def func1(*args):
for arg in args:
print arg
>>> def func2(*args):
return [2 * arg for arg in args]
>>> func2(3, 4, 5)
[6, 8, 10]
>>> func1(1,2,3)
1
2
3
>>> func1(*func2(3, 4, 5))
6
8
10
>>>
如果无法做到这一点,您仍然可以使用func1(*tuple(func2(3, 4, 5)))
(但您不需要)。