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


81

我以为可以在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

错误看起来像:

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax

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

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)

等等

Answers:


70

它确实有效,但仅在Python 3中有效。请参阅PEP 3102。浏览“新功能”文档后,似乎没有2.x向后移植,因此您很不走运。您必须接受任何关键字参数(**kwargs)并手动对其进行解析。您可以使用d.get(k, default)getd[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

同样,仅关键字参数不需要具有默认值。在*args参数之后出现的是将它们标记为仅关键字,而不是默认值的情况:

def f(*args, a): pass
# a is a mandatory, keyword-only argument

多亏您和Imran!您对Imran的代码块和docstring建议的回答完美地回答了这个问题。
jkmacc 2011年

50

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

这是一种常见模式,可为关键字参数提供默认值,并允许任意数量的位置参数:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

如果您根本不使用多余的关键字参数,则无需担心。这使该函数的自记录性降低了,您可以使用正确编写的docstring进行弥补。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.