传递两个变量参数列表

时间:2012-06-14 09:36:46

标签: python

我知道这很有效:

def locations(city, *other_cities): 
    print(city, other_cities)

现在我需要两个变量参数列表,比如

def myfunction(type, id, *arg1, *arg2):
    # do somethong
    other_function(arg1)

    #do something
    other_function2(*arg2)

但是Python不允许使用这两次

2 个答案:

答案 0 :(得分:11)

这是不可能的,因为*arg从该位置捕获所有位置参数。因此,根据定义,第二个*args2将始终为空。

一个简单的解决方案是传递两个元组:

def myfunction(type, id, args1, args2):
    other_function(args1)
    other_function2(args2)

并将其称为:

myfunction(type, id, (1,2,3), (4,5,6))

如果两个函数需要位置参数而不是单个参数,您可以这样调用它们:

def myfunction(type, id, args1, args2):
    other_function(*arg1)
    other_function2(*arg2)

这样做的好处是,在调用myfunction时,你可以使用任何 iterable,甚至是一个生成器,因为被调用的函数永远不会与传递的iterables接触。


如果您真的想使用两个变量参数列表,则需要某种分隔符。以下代码使用None作为分隔符:

import itertools
def myfunction(type, id, *args):
    args = iter(args)
    args1 = itertools.takeuntil(lambda x: x is not None, args)
    args2 = itertools.dropwhile(lambda x: x is None, args)
    other_function(args1)
    other_function2(args2)

它会像这样使用:

myfunction(type, id, 1,2,3, None, 4,5,6)

答案 1 :(得分:1)

您可以使用两个词典。