关于变量函数:python,变量长度位置参数后的默认关键字参数

Python, default keyword arguments after variable length positional arguments

我原以为可以在python 2中的函数调用中使用长度可变的位置参数之后的命名参数,但在导入python类时,我得到了一个SyntaxError。例如,我使用以下"get"方法进行写作:

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的反向端口,所以你运气不好。您必须接受任何关键字参数(**kwargs并手动解析它。你可以用d.get(k, default)得到d[k]default,如果不存在的话。要从kwargs中删除参数,例如在调用超级类的方法之前,请使用d.pop

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

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

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

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来弥补这一点。