2010-04-05 32 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