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

2024-05-19 19:28:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我从饼干里找到两条线

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

我想用它们编一本字典

cookies = dict(rack.session=val)

但是SyntaxError: keyword can't be an expression

所以我试着逃离那个点

re.escape(name)

。。。但它也引发了同样的错误

这怎么可能?根据Pythontype(),name是一个字符串:

type(name)
 <class 'str'>

为什么Python会混淆字符串和表达式?


Tags: 字符串name字典sessionvalbecankeyword
3条回答

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'}
>>> name = 'rack.session'
>>> val = 'CookieVal'
>>> cookies = {name: val}
>>> cookies
{'rack.session': 'CookieVal'}
name = 'rack.session'
val = 'CookieVal'
cookies = dict([(name,val)])
morecookies = {name:val}

至于“为什么Python会混淆字符串和表达式?”,不是。我不知道你为什么认为python会这么做。你把字符串和变量混为一谈,这是完全不同的。

相关问题 更多 >