我从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混合了字符串和表达式?
问题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)