【问题标题】:How to define method with optional argument and argument unpacking?如何定义带有可选参数和参数解包的方法?
【发布时间】:2012-07-17 07:49:16
【问题描述】:

我有一个关于如何在 Python 中定义和调用带有可选参数和 *args 参数的方法的问题。例如,

def test_func(arg1, optional_arg=None, *args):
    ...

并且我希望能够使用以下任一语句调用该方法:

test_func("foo", arg1, arg2, ..., optional_arg="bar")
...
test_func("foo", arg1, arg2, ...) 
# arg1, arg2 ... belongs to *args;
# optional_arg is unset (defaults to None)

这有可能吗,还是在调用这样的方法时我总是必须将 optional_arg 设置为某个值? IE。我只希望在调用函数时专门编写 optional_arg=... 时设置 optional_arg 。

【问题讨论】:

  • 这就是**kwargs 的用途。
  • 除了下面的答案,请注意在 Python 3 中您可以使用 keyword-only arguments

标签: python python-2.7 optional-parameters iterable-unpacking


【解决方案1】:

您应该为此使用**kwargs

def test_func(arg1, *args, **kwargs):
    optional_arg = kwargs.get('optional_arg')
    ...

唯一的限制是关键字参数(可选参数)必须始终在无关键字参数之后

>>> test_func("foo", optional_arg="bar", arg1, arg2, ...)
  File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> test_func("foo", arg1, arg2, ..., optional_arg="bar")
...
>>> test_func("foo", arg1, arg2, ...)
...

【讨论】:

    【解决方案2】:

    不幸的是,位置参数迫使你为命名参数指定一个值,即使它有一个默认值;你无法解决这个问题。

    【讨论】:

      【解决方案3】:

      在 Python 中,关键字参数必须在函数调用的最后,您不能像在第一个示例中那样调用 test_func, optional_arg="bar" 必须在所有非关键字参数之后。

      【讨论】:

      • 谢谢指出;我实际上打算按照您在第一个示例中所说的顺序编写它(现在编辑了 OP)。我的问题主要是第二个例子,如果可以这样称呼它。
      【解决方案4】:

      您可以尝试这种解决方法:

      def test_func(arg1, *args,**optional_arg):
          print arg1 
          print args 
          if 'optional_arg' in optional_arg:
              print optional_arg['optional_arg'] 
      
      test_func("foo", 'v','n',optional_arg="bar")
      
      test_func("foo",'v','n')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-09
        • 2013-08-11
        • 1970-01-01
        • 2012-09-25
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        相关资源
        最近更新 更多