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

时间:2013-07-23 13:01:05

标签: python dictionary

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

7 个答案:

答案 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}

The python docs shows several ways to create dicts.

答案 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}

就够了