SyntaxError: keyword can't be an expression while creating a dictionary
dictionary, python
Solution
The problem with `rack.session` is that python thinks that you're trying to use the value of expression `rack.session` and pass it to `dict()`, which is incorrect because `dict()` expects you to pass variables names when you're using keyword arguments, these variables name are then converted to strings when the dict is created.
Simple example:
>>> dict('val' = 'a')
File "<ipython-input-21-1cdf9688c191>", line 1
SyntaxError: keyword can't be an expression
So, you can't use an object on the left side of `=`, you can only use a valid identifier.
Byte code makes it even more clear what happens with `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
So, with `rack.session = val`, python will think that you're trying to use the value returned from `rack.session` and pass it to `dict`, which is incorrect. Secondly `rack.session` isn't a valid identifier as dots(`.`) are not allowed in python identifiers.
This is applicable to any function in python not even `dict`, a keyword argument must be a valid identifier.
From the docs:
keyword_item ::= identifier "=" expression
Valid examples:
>>> dict(foo = 1, bar = '2')
{'foo': 1, 'bar': '2'}
For your example you can simply do:
>>> val = 'CookieVal'
>>> name = 'rack.session'
>>> dict(((name,val),))
{'rack.session': 'CookieVal'}
#or
>>> {name:val}
{'rack.session': 'CookieVal'}
Problem
I got two strings retrieved from a cookie ``` name = 'rack.session' val = 'CookieVal' ``` Using them I would like to build a dictionary ``` cookies = dict(rack.session=val) ``` but `SyntaxError: keyword can't be an expression` So I tried to escape the (.) dot ``` re.escape(name) ``` ... but it raises the same error How is this possible? According to Python `type()` name is a string: ``` type(name) <class 'str'> ``` Why is Python mixing up strings and expressions?