3

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

4

7 回答 7

9

问题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'}
于 2013-07-23T13:23:53.157 回答
1
>>> name = 'rack.session'
>>> val = 'CookieVal'
>>> cookies = {name: val}
>>> cookies
{'rack.session': 'CookieVal'}
于 2013-07-23T13:03:47.557 回答
1
name = 'rack.session'
val = 'CookieVal'
cookies = dict([(name,val)])
morecookies = {name:val}

至于“为什么 Python 会混淆字符串和表达式?”,不是。我不确定你为什么认为 python 这样做。您正在混淆字符串和变量,这是完全不同的。

于 2013-07-23T13:06:27.847 回答
1

您应该以这种方式构建字典

name = 'rack.session'
val = 'CookieVal'

d = {name: val}

print d

给你

>>> 
{'rack.session': 'CookieVal'}
>>> 

更多关于字典http://docs.python.org/2/tutorial/datastructures.html#dictionaries

于 2013-07-23T13:21:46.587 回答
0

原因是您给出了dictthis 表达式:rack.session=val,而不是关键字。

相反,您可以使用dict({name: val})参数为 的来解决此问题{name:val}。当然,你可以只使用{name: val}.

python 文档展示了几种创建字典的方法。

于 2013-07-23T13:06:11.670 回答
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'}
于 2020-04-10T09:08:34.440 回答
-1

试试这个:

name = 'rack.session'
val = 'CookieVal'
cookies = dict(zip([name],[val]))

编辑:我的情况对你来说太多了

cookies = {name:val}

足够

于 2013-07-23T13:04:33.980 回答