Python,可变长度位置参数后的默认关键字参数

jkm*_*acc 78 python python-2.x variadic-functions named-parameters default-parameters

我想我可以在Python 2的函数调用中使用可变长度位置参数之后的命名参数,但是SyntaxError在导入python类时我得到了一个.我正在使用以下"get"方法编写,例如:

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self, *args, raw=False, vars=None):
        print len(args)
        print raw
        print vars
Run Code Online (Sandbox Code Playgroud)

错误看起来像:

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我希望能够通过几种方式调用该方法:

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)
Run Code Online (Sandbox Code Playgroud)

等等

小智 69

它确实有效,但仅限于Python 3.参见PEP 3102.从浏览"什么是新的"文件来看,似乎没有2.x的后退,所以你运气不好.您必须接受任何关键字参数(**kwargs)并手动解析它.您可以使用d.get(k, default)为GET d[k]default如果这是不存在的.要从kwargs例如调用超类方法之前删除参数,请使用d.pop.


需要注意的是在def get(self, *args, raw=False, vars=None):中,raw=Falsevars=None没有什么做关键字参数.这些是默认参数值.具有默认值的参数可以按位置传递,而没有默认值的参数可以通过关键字传递:

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword
Run Code Online (Sandbox Code Playgroud)

同样,仅关键字参数不需要具有默认值.在*args参数之后,将它们标记为仅关键字,而不是存在默认值:

def f(*args, a): pass
# a is a mandatory, keyword-only argument
Run Code Online (Sandbox Code Playgroud)


Imr*_*ran 47

Python的语法不允许函数和关键字参数中的变量args同时具有默认值.如果必须具有关键字参数以及任意数量的位置参数,则还需要允许任意数量的关键字参数.

这是为关键字参数提供默认值以及允许任意数量的位置参数的常见模式:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)
Run Code Online (Sandbox Code Playgroud)

如果您根本不使用额外的关键字参数,则无需担心.这使得函数的自我记录变得更少,您可以使用正确编写的文档字符串来弥补这一点.