SyntaxError: la palabra clave no puede ser una expresión al crear un diccionario

Tengo dos cadenas recuperadas de una cookie

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

Usándolos me gustaría construir un diccionario.

 cookies = dict(rack.session=val) 

pero SyntaxError: keyword can't be an expression

Así que traté de escapar del punto (.)

 re.escape(name) 

… pero plantea el mismo error

¿Cómo es esto posible? De acuerdo con Python, el nombre de type() es una cadena:

 type(name)  

¿Por qué Python está mezclando cadenas y expresiones?

El problema con rack.session es que Python piensa que estás intentando usar el valor de expresión rack.session y pasarlo a dict() , lo cual es incorrecto porque dict() espera que pases nombres de variables cuando lo estés usando argumentos de palabra clave, el nombre de estas variables se convierten en cadenas cuando se crea el dict.

Ejemplo simple:

 >>> dict('val' = 'a') File "", line 1 SyntaxError: keyword can't be an expression 

Por lo tanto, no puede usar un objeto en el lado izquierdo de = , solo puede usar un identificador válido.

El código de bytes hace que sea aún más claro lo que sucede con 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 

Entonces, con rack.session = val , python pensará que estás tratando de usar el valor devuelto por rack.session y lo pasa a dict , lo cual es incorrecto. En segundo lugar, rack.session no es un identificador válido, ya que los puntos ( . ) No están permitidos en los identificadores de python.

Esto es aplicable a cualquier función en Python ni siquiera dict , un argumento de palabra clave debe ser un identificador válido.

De los documentos :

 keyword_item ::= identifier "=" expression 

Ejemplos válidos:

 >>> dict(foo = 1, bar = '2') {'foo': 1, 'bar': '2'} 

Para su ejemplo simplemente puede hacer:

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

En cuanto a “¿Por qué Python está mezclando cadenas y expresiones?”, No lo es. No estoy seguro de por qué crees que Python está haciendo esto. Estás mezclando cadenas y variables, que son bastante diferentes.

Deberías construir un diccionario de esta manera.

 name = 'rack.session' val = 'CookieVal' d = {name: val} print d 

te dio

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

Más sobre los diccionarios http://docs.python.org/2/tutorial/datastructures.html#dictionaries

La razón es que le da al dict esta expresión: rack.session=val , en lugar de una palabra clave.

En su lugar, puede solucionar este problema utilizando dict({name: val}) , donde el argumento es {name:val} . Por supuesto, puedes usar {name: val} .

Los documentos de Python muestran varias formas de crear dictados.

Prueba esto:

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

Edit: mi caso es demasiado para tu caso

 cookies = {name:val} 

es suficiente