【问题标题】:Specifying list of arguments with minimum one argument in list指定列表中至少有一个参数的参数列表
【发布时间】:2016-05-10 05:28:09
【问题描述】:

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

我正在尝试找出我可以使用哪些原型来定义这个参数。我考虑了以下几点:

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

是否有其他方法可以指定一个函数,该函数接受一个参数列表,其中包含最少一个参数?

【问题讨论】:

  • 还有assert len(args) > 0会抛出AssertionError
  • 啊,是的。绝对是另一个可行的选择。
  • if not args 比明确检查其长度更惯用。

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


【解决方案1】:

您可以在 Python 3.5 中(我相信,当 PEP 3102 出现时,它已经存在了 3.0),但有 额外的参数在没有默认值的情况下定义 并且 在调用定义的函数时以关键字形式提供。

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

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

在不提供must_specify = 'specified' 形式的关键字参数的情况下调用foo() 将导致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 并且坚持要切换,那么 cmets 中建议的解决方案是您最好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多