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