4

以下是无效的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,这在某些方面类似于列表,而在其他方面类似于字典。该__init__方法必须采用“我的第一个元素”和“my_first_element”之类的键,并将它们视为不同的东西。该类和__init__**kwargs 可以正常工作,但初始化我的类是我的示例形式的多线,它确实有效,而且看起来它可能更简单。)

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

为什么以下内容有效?:

myValidFun(**{"invalid identifier":6})
4

3 回答 3

2

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)。但是,它只能通过字典访问。

于 2013-05-22T19:40:28.580 回答
0

您的键名不能有空格。通过在函数调用中的参数周围加上引号,计算表达式

尝试这个

def myValidFun(**kwargs):
    if "kw_arg_zero" in kwargs:
        print kwargs["kw_arg_zero"]


myValidFun(kw_arg_zero="whatever")
于 2013-05-22T20:07:29.287 回答
0

myInvalidFun(kw arg zero=6):无效,因为标识符中不允许有空格。

myValidFun("kw arg zero"=6) 无效,因为函数期望关键字是有效的变量名而不是字符串。像这样的东西"kw arg zero"=6也是无效的,因为你不能给字符串赋值。

dict("kw arg zero"=6): 同上。BTWdict()接受 (key,value) 对或可迭代对象。

这是有效的,因为您只在此处传递了一个 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})    
    
于 2013-05-22T19:45:11.390 回答