2

我知道这很好用:

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 不允许使用这个两次

4

2 回答 2

12

这是不可能的,因为从该位置开始*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因为被调用的函数永远不会与传递的可迭代对象接触。


如果你真的想使用两个变量参数列表,你需要某种分隔符。以下代码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)
于 2012-06-14T09:38:57.113 回答
1

您可以改用两个字典。

于 2012-06-14T09:39:57.660 回答