2017-10-10 71 views
4

我有兩種可能的方式調用函數。函數列表和解壓列表

隨着列表:

some_list = [1,2,3,4] 
my_function(some_list) 

並配有解壓列表或只是多個參數:

my_function(*some_list) == my_function(1,2,3,4) 

其等於第一種情況,以及:

my_function(some_list) == my_function(*some_list) == my_function(1,2,3,4) 

在函數my_function我想迭代列表。所以對於弗里斯特情況下,功能如下:

def my_function(arg): 
    for i in arg: 
     # do something 

現在對於第二種情況,我將重新打包解包列表,從而爲以下功能:

def my_function(*arg): 
    for i in arg: 
     # do something 

是否有辦法如何在兩種情況下都有一個很好的單一功能?

+0

檢查這篇文章[https://pythontips.com/2013/08/04/args -and-kwargs合蟒-解釋/]。這可能是有用的 –

+0

你想如何處理多個列表輸入? – James

回答

2

您可以wrapp創建autounpacking檢查裝飾功能:

import functools 


def autounpack(f): 
    @functools.wraps(f) 
    def wrapped(*args): 
    if len(args) == 1 and type(args[0]) == list: 
     return f(*args[0]) 
    else: 
     return f(*args) 
    return wrapped 


@autounpack 
def my_f(*args): 
    print(args) 

這裏有一個live example