SyntaxError:关键字在创建字典时不能是表达式

use*_*645 2 python dictionary

我从cookie中检索了两个字符串

name = 'rack.session'
val = 'CookieVal'
Run Code Online (Sandbox Code Playgroud)

使用它们我想建立一本字典

cookies = dict(rack.session=val)
Run Code Online (Sandbox Code Playgroud)

SyntaxError: keyword can't be an expression

所以我试图逃避(.)点

re.escape(name)
Run Code Online (Sandbox Code Playgroud)

...但它引发了同样的错误

这怎么可能?根据Python type()名称是一个字符串:

type(name)
 <class 'str'>
Run Code Online (Sandbox Code Playgroud)

为什么Python混合了字符串和表达式?

Ash*_*ary 8

问题rack.session是python认为你正在尝试使用表达式的值rack.session并将其传递给dict(),这是不正确的,因为dict()在你使用关键字参数时希望你传递变量名,然后这些变量名转换为字符串时dict已创建.

简单的例子:

>>> dict('val' = 'a')     
  File "<ipython-input-21-1cdf9688c191>", line 1
SyntaxError: keyword can't be an expression
Run Code Online (Sandbox Code Playgroud)

因此,您不能使用左侧的对象=,您只能使用有效的标识符.

字节代码使得更清楚的是rack.session:

>>> import dis
>>> dis.dis(lambda : dict(rack.session , val))
  1           0 LOAD_GLOBAL              0 (dict)
              3 LOAD_GLOBAL              1 (rack)   # load the object `rack`
              6 LOAD_ATTR                2 (session)# use the value of it's attribute
                                                    # `session`
              9 LOAD_GLOBAL              3 (val)
             12 CALL_FUNCTION            2
             15 RETURN_VALUE   
Run Code Online (Sandbox Code Playgroud)

因此,使用rack.session = val,python会认为您正在尝试使用返回的值rack.session并将其传递给dict,这是不正确的.其次rack.session不是有效的标识符,因为.python标识符中不允许使用dots().

这适用于python中的任何函数,偶数dict,关键字参数必须是有效的标识符.

来自文档:

keyword_item   ::=  identifier "=" expression
Run Code Online (Sandbox Code Playgroud)

有效示例:

>>> dict(foo = 1, bar = '2')
{'foo': 1, 'bar': '2'}
Run Code Online (Sandbox Code Playgroud)

对于您的示例,您可以简单地执行:

>>> val = 'CookieVal'
>>> name = 'rack.session'
>>> dict(((name,val),))
{'rack.session': 'CookieVal'}
#or
>>> {name:val}
{'rack.session': 'CookieVal'}
Run Code Online (Sandbox Code Playgroud)