Python, default keyword arguments after variable length positional arguments
我原以为可以在python 2中的函数调用中使用长度可变的位置参数之后的命名参数,但在导入python类时,我得到了一个
1 2 3 4 5 6 7 8 | 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 |
错误如下:
1 2 3 | def get(self, *args, raw=False, vars=None): ^ SyntaxError: invalid syntax |
我希望能够通过几种方式调用该方法:
1 2 3 4 | f = Foo() f.get(arg1, arg2) f.get(arg1, raw=True) f.get(arg1, arg2, raw=True, vars=something) |
等。
它确实有效,但只在Python3中有效。见PEP 3102。从浏览"What's New"文档来看,似乎没有2.x的反向端口,所以你运气不好。您必须接受任何关键字参数(
注意,在
1 2 3 4 | def f(a=1): pass f(2) # works, passing a positionally def f(a): pass f(a=2) # works, passing a by keyword |
同样,只使用关键字的参数不需要具有默认值。在
1 2 | def f(*args, a): pass # a is a mandatory, keyword-only argument |
python的语法不允许在函数和关键字参数中同时使用默认值的变量参数。如果必须有关键字参数和任意数量的位置参数,则还需要允许任意数量的关键字参数。
这是为关键字参数提供默认值以及允许任意数量位置参数的常见模式:
1 2 3 | def foo(*args, **kwargs): raw = kwargs.pop('raw', False) vars = kwargs.pop('vars', None) |
如果您根本不使用额外的关键字参数,那么就没有什么可担心的了。这使得函数的自记录功能有所减少,您可以用一个正确编写的docstring来弥补这一点。