以下是无效的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”这样的键,并将它们视为不同的东西。 class和__init__
可以很好地处理** kwargs,但初始化我的类是一个多行的,我的例子的形式确实有效,看起来可能更简单。)
编辑:我理解标识符的概念,我的无效代码就是为了说明问题。我想我的问题应该改为:
为什么以下内容有效?:
myValidFun(**{"invalid identifier":6})
答案 0 :(得分:1)
python函数的关键字必须是有效的标识符。这是因为另一方面,它们需要解压缩为标识符(变量):
def foo(arg=3):
print arg
您拥有的大多数内容都不是有效的标识符:
kw arg zero #Not valid identifier -- Can't have spaces
"kw arg zero" #Not valid identifier -- It's parsed as a string (expression)
做
dict("kw arg zero" = 6)
与解析器没有区别
myValidFunc("kw arg zero" = 6)
现在正如您所指出的,您可以传递事物视图映射打包/解包(**kwargs
)。但是,它只能通过字典访问。
答案 1 :(得分:0)
myInvalidFun(kw arg zero=6):
无效,因为identifiers中不允许使用空格。
myValidFun("kw arg zero"=6)
无效,因为函数希望关键字是有效的变量名而不是字符串。像"kw arg zero"=6
这样的东西也是无效的,因为你不能为字符串赋值。
dict("kw arg zero"=6)
:与上述相同。 BTW dict()
接受(键,值)对或可迭代。
这是有效的,因为你只在这里传递了一个dict,而dicts可以将字符串作为带空格的键。
def myValidFun(**kwargs): #using ** here simply packs the dictionary again
pass
myValidFun(**{"invalid identifier":6})
这是有效的,因为您在函数定义中使用了有效的标识符
def myValidFun( foo = 5): #foo from dict replaces it's default value
print foo #prints 6
myValidFun(**{"foo":6})
无效:
def myValidFun(foo bar = 5): # syntax error, invalid identifier
print foo
myValidFun(**{"foo bar":6})
答案 2 :(得分:0)
您的密钥名称不能包含空格。 通过在函数调用中的参数周围加上引号,可以计算表达式
试试这个
def myValidFun(**kwargs):
if "kw_arg_zero" in kwargs:
print kwargs["kw_arg_zero"]
myValidFun(kw_arg_zero="whatever")