将函数参数转换为列表

时间:2015-01-09 18:12:28

标签: python

我有一个带有一组明确参数的函数,但是在开发期间,它收到的参数数量可能会发生变化。 每个参数可以是字符串或列表。我想通过函数的参数循环,如果它们是一个字符串,将它们转换为具有该单个元素的列表。

我尝试使用locals()来循环参数,但我不知道如何在迭代期间修改值,所以我猜这不是正确的方法:

def function(a, b, c, d):
    for key in locals():
        if type(key) == str:
            # ??? key = list(locals[key])

    # ... more code over here, assuming that a,b,c,d are lists

正确的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用isinstance(key, str)检查变量是否为str

def function(a, b, c, d):
    l= locals()
    for i in l:
        key = l[i]
        if isinstance(key, str):
            l[i] = [l[i]]
    l = l.values()
    print (l)
function('one', 'two', ['bla','bla'], ['ble'])

如果你想要列表,那么你需要一行

 l = l.values()

这将是

[['a'], ['c'], ['b'], ['d']]

编辑:正如您所建议的那样,正确的程序是

def function(a, b, c, d):
    l= locals()
    dirty= False
    for i in l:
        key = l[i]
        if isinstance(key, str):
            l[i] = [l[i]]
            dirty= True
    if dirty:
        function(**l)
    else:
        print a, b, c, d
    print (l)

function('one', 'two', ['bla','bla'], ['ble'])

这将输出

['one'], ['bla', 'bla'], ['two'], ['ble']

答案 1 :(得分:1)

使用*args or **kwargs

def use_args(*args):
    # covert strings to `list` containing them
    new_args = map(lambda x: [x] if isinstance(x, str) else x, args)
    return new_args
print use_args([1, 2], "3")

输出:

[[1, 2], ['3']]

答案 2 :(得分:0)

def function(*args):

    arg_list = list(args)
    for i in range(len(arg_list)):
        if type(arg_list[i]) == str:
            #Do the stuff
        elif type(arg_list[i]) == list:
            #Do the stuff
        else:
            #Do the stuff

function ('a','b', ['c', 'd', 'e'])