2017-10-10 26 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