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

我以为我可以在Python 2中的函数调用中使用可变长度位置参数后使用命名参数,但是当我导入python类时,我得到一个SyntaxError 。 我正在用下面的“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) 

等等

它可以工作,但只能在Python 3中使用。参见PEP 3102 。 从看过“最新的”文件看来,似乎没有2.x的backport,所以你运气不好。 你必须接受任何关键字参数( **kwargs )并手动parsing它。 你可以使用d.get(k, default)来获得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 

类似地,仅关键字参数不需要具有默认值。 在*args参数之后,是将它们标记为仅关键字,而不是默认值的存在:

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

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

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

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

如果你根本没有使用额外的关键字参数,你没有什么可担心的。 这使得这个函数的自我loggingless一点,你可以用一个正确的书面文档string来弥补。

Interesting Posts