问题rack.session
在于python认为您正在尝试使用表达式的值rack.session
并将其传递给dict()
,这是不正确的,因为dict()
当您使用关键字参数时期望您传递变量名称,然后这些变量名称在字典被创建。
简单的例子:
>>> dict('val' = 'a')
File "<ipython-input-21-1cdf9688c191>", line 1
SyntaxError: keyword can't be an expression
所以,你不能使用左边的对象=
,你只能使用一个有效的标识符。
字节码使发生的事情更加清楚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
因此,使用rack.session = val
,python 会认为您正在尝试使用从返回的值rack.session
并将其传递给dict
,这是不正确的。其次rack.session
,它不是一个有效的标识符,因为.
在 python 标识符中不允许使用点()。
这适用于 python 中的任何函数,甚至不是dict
,关键字参数必须是有效的标识符。
从文档:
keyword_item ::= identifier "=" expression
有效示例:
>>> dict(foo = 1, bar = '2')
{'foo': 1, 'bar': '2'}
对于您的示例,您可以简单地执行以下操作:
>>> val = 'CookieVal'
>>> name = 'rack.session'
>>> dict(((name,val),))
{'rack.session': 'CookieVal'}
#or
>>> {name:val}
{'rack.session': 'CookieVal'}