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

Posted

技术标签:

【中文标题】Python,可变长度位置参数后的默认关键字参数【英文标题】:Python, default keyword arguments after variable length positional arguments 【发布时间】:2011-08-21 20:42:06 【问题描述】:

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

等等

【问题讨论】:

【参考方案1】:

它确实有效,但仅在 Python 3 中有效。请参阅 PEP 3102。从浏览“最新消息”文档来看,似乎没有 2.x 反向移植,所以你不走运。您必须接受任何关键字参数 (**kwargs) 并手动解析它。您可以使用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

【讨论】:

感谢您和伊姆兰!您对 Imran 的代码块和文档字符串建议的回答完美地回答了这个问题。【参考方案2】:

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

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

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

如果您根本不使用额外的关键字参数,则无需担心。这使得函数的自文档化程度降低了,您可以使用正确编写的文档字符串来弥补。

【讨论】:

以上是关于Python,可变长度位置参数后的默认关键字参数的主要内容,如果未能解决你的问题,请参考以下文章

Python的位置参数默认参数关键字参数可变参数

[python][oldboy]关键字参数和位置参数,默认参数,可变长参数(无名,有名)

Python的位置参数、默认参数、关键字参数、可变参数区别

python位置参数默认参数关键字参数可变参数的区别

python位置参数默认参数关键字参数可变参数的区别

python的位置参数默认参数关键字参数可变参数区别