2010-04-05 60 views
3

我有两个Python函数,它们的函数定义中都带有可变参数。举个简单的例子: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)) - 但我不想func1args([6, 7, 8],),我希望它是(6, 7, 8),仿佛它被称为func1(6, 7, 8)而不是func1([6, 7, 8])

通常,我只会使用func1(*func2(3, 4, 5))或者有func1检查以查看args[0]是否是一个列表。不幸的是,我不能在这个特定的实例中使用第一个解决方案,并且应用第二个解决方案需要在许多地方进行这样的检查(在func1的角色中有很多功能)。

有没有人有一个想法如何做到这一点?我想可以使用某种内省,但我可能是错的。

+7

“'在这个特殊的instance'我不能使用第一个解决方案” 为什么不呢? – interjay 2010-04-05 21:16:51

+0

我正在使用调用Python函数的解析器,但不支持在语法中解包。 – exupero 2010-04-06 10:54:49

回答

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) 
4

您可以考虑编写函数装饰器来检查第一个参数是否为列表。将修饰器应用于现有的功能比修改功能要简单一些。

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)))(但你并不需要)。

+0

我认为OP有函数返回标量值,不仅是元组或列表。将它们全部转换为通用标准太昂贵。 – Yaroslav 2010-04-05 22:02:09