我从cookie中检索了两个字符串
name = 'rack.session'
val = 'CookieVal'
使用它们我想建立一个字典
cookies = dict(rack.session=val)
但是SyntaxError: keyword can't be an expression
所以我试图逃避(。)点
re.escape(name)
...但它引发了同样的错误
这怎么可能?根据Python type()
,name是一个字符串:
type(name)
<class 'str'>
为什么Python混合了字符串和表达式?
答案 0 :(得分: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
因此,您无法使用=
左侧的对象,只能使用有效的标识符。
字节代码可以更清楚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
,关键字参数必须是有效的标识符。
来自docs:
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'}
答案 1 :(得分:1)
>>> name = 'rack.session'
>>> val = 'CookieVal'
>>> cookies = {name: val}
>>> cookies
{'rack.session': 'CookieVal'}
答案 2 :(得分:1)
name = 'rack.session'
val = 'CookieVal'
cookies = dict([(name,val)])
morecookies = {name:val}
至于“为什么Python混合字符串和表达式?”,它不是。我不确定你为什么认为python正在这样做。你正在混合字符串和变量,这是完全不同的。
答案 3 :(得分:1)
你应该用这种方式建立一个字典
name = 'rack.session'
val = 'CookieVal'
d = {name: val}
print d
给你
>>>
{'rack.session': 'CookieVal'}
>>>
有关词典的更多信息http://docs.python.org/2/tutorial/datastructures.html#dictionaries
答案 4 :(得分:0)
原因是您提供dict
此表达式:rack.session=val
,而不是关键字。
相反,您可以使用dict({name: val})
解决此问题,其中参数为{name:val}
。当然,您可以使用{name: val}
。
答案 5 :(得分:0)
Ashwini Chaudhary的回答很好,但是我可以添加更多内容来澄清问题。
出现此错误的主要原因是因为表达式包含一个点-'。符号。引发错误的原因是:“关键字不能是表达式”。
这-'。'符号使Python认为,当前的关键字名称不是有效名称,而是您尝试评估的表达式。一般来说,您可以将仅有效名称作为dict()的键,因为这样的名称可能是变量的名称,尽管事实上这里没有变量求值。
因此,您的键只能包含字母,数字或下划线,并且不能以数字开头(如前所述,它们必须是有效的Python标识符)。
例如,这些无效:
d = dict(1='Bob')
d = dict(b.a='Bob')
d = dict('b'='Bob')
d = dict(b$='Bob')
第一,第二和第三位无效,因为它们是表达式并且由于它们不是有效的标识符,而第四位仅是因为它不是有效的标识符。
要避免当前的限制,可以使用上面提到的一种方法,使它们接受变量求值,并且如果键是字符串,则它可以包含任何字符:
d = dict([(1, 'Bob')])
d = dict(zip([1],['Bob']))
d = {1:'bob'}
或这个:
d = dict.fromkeys([1])
d[1] = 'Bob'
例如关键值评估差异:
x = 1
d = dict(x='Bob')
d
{'x': 'Bob'}
x = 1
d = dict([(x, 'Bob')])
d
{1: 'Bob'}
答案 6 :(得分:-1)
试试这个:
name = 'rack.session'
val = 'CookieVal'
cookies = dict(zip([name],[val]))
编辑:我的案子对你的案子来说太多了
cookies = {name:val}
就够了