在函数中连接必需的参数和可选的参数?

时间:2016-03-07 01:49:17

标签: python

我想定义一个接受任意数量的字典但至少有两个字典的函数,我想迭代它们。目前我只是创建前两个列表并附加可选的列表:

def func(dict1, dict2, *dicts):
    dicts = [dict1, dict2] + list(dicts)
    for d in dicts:
        # Do stuff

但我觉得这有点不必要的复杂。我想知道检查*dicts长度的一个替代方案是否会更好,因为我不需要创建一个新的可迭代:

def func(*dicts):
    if len(dicts) < 2:
        raise ValueError('Too few dictionaries, you must give this function at least 2.')
    for d in dicts:
        # Do stuff

但我仍然感觉不太方便,因为我需要在某处解释这个,因为函数签名看起来像接受任意数量的dicts(甚至0或1)。那么有没有办法获得第一个选项的签名而无需在函数中创建一个完整的 new iterable?

2 个答案:

答案 0 :(得分:3)

第一种方法对我来说似乎很好,你可以通过使用元组代替第一对的列表来简化它,这样你就不需要额外的list调用:

all_dicts = (dict1, dict2) + dicts

如果你只是在迭代,你就不需要制作一个临时变量:

for d in (dict1, dict2) + dicts:

答案 1 :(得分:1)

选项是使用itertools.chain()

from itertools import chain

def func(dict1, dict2, *dicts):
    for d in chain((dict1, dict2), dicts):
        # Do stuff

我认为这不比您提出的第一个解决方案更简单,更高效。它需要导入。 @ tzaman的回答似乎很好。