在列表中指定最少一个参数的参数列表

时间:2016-02-01 16:56:29

标签: python function arguments parameter-passing optional-parameters

所以,我有一些函数可以获取一个参数列表,其中包含最少一个参数,但可能是一个完整的参数列表。我知道有几种方法可以定义这种方法,但我正在尝试确定各种替代方案的用途以及每种方法的各种优点。

我正在试图找出可用于定义此参数的可能原型。我考虑过以下几点:

def func(arg_1, *args):
    arg_list = (arg_1,) + args
    # do stuff with arg_list

以及

def func(*args):
    if len(args) == 0: raise Exception("Not enough arguments specified")
    # do stuff with args

是否有其他方法可以指定一个带有最少一个参数的参数列表的函数?

1 个答案:

答案 0 :(得分:1)

Python 3.5 中,您可以(自3.0以来一直存在,我相信 PEP 3102 时出现)但是在调用已定义的函数时,以关键字形式提供的额外参数的限制没有默认值

这是通过添加*作为分隔符并在其后添加所需的参数来完成的:

def foo(*, must_specify, **kwargs): pass

在不提供foo()形式的关键字参数的情况下调用must_specify = 'specified'将导致TypeError暗示对该特定参数的要求:

foo()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-45-624891b0d01a> in <module>()
----> 1 foo()

TypeError: foo() missing 1 required keyword-only argument: 'must_specify'

可以提供自己的位置参数,但是*args形式的位置分组参数不能是:

def foo(pos_arg, *, must_specify, **kwargs): pass

很好,但是:

def foo(pos_arg, *args, *, must_specify, **kwargs): pass

SyntaxError。这样做是因为*基本上与*args的“丢弃”形式相同。

无论哪种方式,都没有其他语法方式(我知道)可以满足你想要的限制。如果使用kwargs对您来说太麻烦,或者您正在使用Py2并且坚持要切换,那么评论中建议的解决方案是您最好的选择。