功能:**kwargs 允许不正确命名的变量

Eth*_*oon 5 python python-2.x

以下是无效的Python:

def myInvalidFun(kw arg zero=6):
    pass
Run Code Online (Sandbox Code Playgroud)

以下是有效的Python:

def myValidFun(**kwargs):
    if kwargs.has_key("kw arg zero"):
        pass
Run Code Online (Sandbox Code Playgroud)

myValidFun然而,打电话是很棘手的。例如,以下几种方法不起作用:

myValidFun(kw arg zero=6)      # SyntaxError: invalid syntax
myValidFun("kw arg zero"=6)    # SyntaxError: keyword can't be an expression

kwargs = dict("kw arg zero"=6) # SyntaxError: keyword can't be an expression 
myValidFun(**kwargs)
Run Code Online (Sandbox Code Playgroud)

(也许与最后两个错误相同的错误暗示了幕后发生的情况?)但是,这确实有效:

kwargs = {"kw arg zero": 6}
myValidFun(**kwargs)
Run Code Online (Sandbox Code Playgroud)

myValidFun("kw arg zero"=6)鉴于创建字典的 {:} 语法,是否有特别无效的 原因?

(更多背景:我有一个很像字典的类,只是进行了大量的验证,并且__init__使用字典的条目构建一个容器,但不是字典......它实际上是一个 XML ElementTree,它在某些方面类似于列表,而在其他方面则类似于字典。该__init__方法必须采用“我的第一个元素”和“my_first_element”之类的键,并将它们视为不同的事物。类和__init__**kwargs 一起工作正常,但初始化我的类是我的示例形式的多行代码,它确实有效,而且似乎可以更简单。)

编辑:我理解标识符的概念,我的无效代码是为了说明这一点。我想我的问题应该改写为:

为什么以下内容有效?:

myValidFun(**{"invalid identifier":6})
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 2

python 函数的关键字必须是有效的标识符。这是因为在另一方面,它们需要被解包成标识符(变量):

def foo(arg=3):
    print arg
Run Code Online (Sandbox Code Playgroud)

您拥有的大部分内容都不是有效的标识符:

kw arg zero  #Not valid identifier -- Can't have spaces
"kw arg zero" #Not valid identifier -- It's parsed as a string (expression)
Run Code Online (Sandbox Code Playgroud)

正在做

dict("kw arg zero" = 6)
Run Code Online (Sandbox Code Playgroud)

与解析器没有什么不同

myValidFunc("kw arg zero" = 6)
Run Code Online (Sandbox Code Playgroud)

现在正如您所指出的,您可以传递事物视图映射打包/解包(**kwargs)。然而,它只能通过字典来访问。