¿Cómo puedo convertir la strrepresentación de a dict, como la siguiente cadena, en a dict?
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Yo prefiero no utilización eval. ¿Qué más puedo usar?
La razón principal de esto, es una de mis clases de compañeros de trabajo que escribió, convierte todas las entradas en cadenas. No estoy de humor para ir y modificar sus clases, para lidiar con este problema.
                    
                        python
                                string
                                dictionary
                                
                    
                    
                        UberJumper
fuente
                
                fuente

"nulltruefalseNoneTrueFalseRespuestas:
A partir de Python 2.6, puede usar el incorporado
ast.literal_eval:Esto es más seguro que usarlo
eval. Como dicen sus propios documentos:>>> ayuda (ast.literal_eval) Ayuda sobre la función literal_eval en el módulo ast: literal_eval (nodo_o_cadena) Evalúe de forma segura un nodo de expresión o una cadena que contenga un Python expresión. La cadena o nodo proporcionado solo puede consistir en lo siguiente Estructuras literales de Python: cadenas, números, tuplas, listas, dictos, booleanos, y ningunoPor ejemplo:
fuente
"dict(a=1)"cadenas de estilo?https://docs.python.org/3.8/library/json.html
JSON puede resolver este problema, aunque su decodificador quiere comillas dobles alrededor de claves y valores. Si no te importa reemplazar un truco ...
NOTA: si tiene comillas simples como parte de sus claves o valores, esto fallará debido a un reemplazo incorrecto de caracteres. Esta solución solo se recomienda si tiene una fuerte aversión a la solución eval.
Más acerca de la comilla simple de json: jQuery.parseJSON arroja el error "JSON no válido" debido a una comilla simple escapada en JSON
fuente
{"foo": "b'ar"}{'foo': (1, 2, 3)}+1para informar que el decodificador quiere comillas dobles alrededor de claves y valores."{0: 'Hello'}".utilizando
json.loads:fuente
Para el ejemplo de OP:
Podemos usar Yaml para tratar este tipo de json no estándar en cadena:
fuente
Si siempre se puede confiar en la cadena , puede usar
eval(o usarliteral_evalcomo se sugiere; es seguro sin importar cuál sea la cadena). De lo contrario, necesita un analizador. Un analizador JSON (como simplejson) funcionaría si solo almacena contenido que se ajuste al esquema JSON.fuente
Uso
json. laastbiblioteca consume mucha memoria y más lento. Tengo un proceso que necesita leer un archivo de texto de 156Mb.Ast¡con 5 minutos de retraso para el diccionario de conversiónjsony 1 minuto con un 60% menos de memoria!fuente
Para resumir:
Resultados:
Conclusión: prefiera json.loads
fuente
fuente
{o}. ¿Qué pasa si está anidadodict? ¿Qué pasa si el valor contiene,?no se utilizan libs:
NOTA: Como se ha codificado
split("'"), funcionará solo para cadenas en las que los datos están "entre comillas simples".fuente