【发布时间】:2013-05-22 19:24:11
【问题描述】:
以下是无效的python:
def myInvalidFun(kw arg zero=6):
pass
以下是有效的python:
def myValidFun(**kwargs):
if kwargs.has_key("kw arg zero"):
pass
然而,打电话给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)
(也许与最后两个相同的错误暗示了幕后发生的事情?)但是,这确实有效:
kwargs = {"kw arg zero": 6}
myValidFun(**kwargs)
根据用于创建字典的 {:} 语法,是否有原因,特别是 myValidFun("kw arg zero"=6) 无效?
(更多背景:我有一个很像字典的类,只有大量的验证,还有一个__init__,它使用字典的条目构建一个容器,但不是字典......它实际上是一个 XML ElementTree,它在某些方面类似于列表,而在其他方面类似于 dict。__init__ 方法必须采用“my first element”和“my_first_element”之类的键,并将它们视为不同的东西。类和@987654329 @ 与 **kwargs 一起工作正常,但初始化我的类是我的示例形式的多线程,它确实有效,而且看起来可能更简单。)
编辑:我理解标识符的概念,我的无效代码是为了说明这一点。我想我的问题应该改写为:
为什么以下有效?:
myValidFun(**{"invalid identifier":6})
【问题讨论】:
-
将数据作为关键字参数传递:data={ ... } 因为空格不能作为参数名称。
-
这听起来像是一个更安全的主意。我的意思是,我知道最后一个有效的片段适用于我当前的 python 实现,但对我来说似乎有点粗略。感谢您的建议。
标签: python python-2.x