¿Biblioteca que convierte una cadena de salida de Python en una estructura de datos Elisp?

7

Digamos que evalúo el siguiente código de Python:

import inspect
import scipy.ndimage.filters

list (inspect.getargspec (scipy.ndimage.filters.gaussian_filter1d))
# => [['input', 'sigma', 'axis', 'order', 'output', 'mode', 'cval'],
#      None, None, (-1, 0, None, 'reflect', 0.0)]

Me gustaría transformar la cadena de salida, que es simplemente la salida de impresión de Python, en una estructura de datos Elisp. Entonces necesito una función foo que haga esto:

(foo "[['input', 'sigma', 'axis', 'order', 'output', 'mode', 'cval'], None, None, (-1, 0, None, 'reflect', 0.0)]")
;; =>
;; (("input"
;;   "sigma"
;;   "axis"
;;   "order"
;;   "output"
;;   "mode"
;;   "cval")
;;  nil
;;  nil
;;  (-1 0 nil "reflect" 0.0))

Si bien no es difícil escribir una versión fooque funcione para esta instancia específica, me pregunto si hay una biblioteca que haga esto de manera genérica, es decir, que sea capaz de manejar cualquier estructura compleja de Python.

abo-abo
fuente

Respuestas:

8

Use JSON, no la sintaxis de Python

Lo que estás buscando json.eles parte de Emacs.

Tenga en cuenta que no leerá el formato Python OOTB; Hay al menos 3 problemas:

  1. 'foo' no se reconoce como una cadena
  2. las palabras clave true/ false/ nullse reconocen en lugar de True/ False/None
  3. las tuplas (1,"bar")no son reconocidas

Solución completa usando json.dumps en Python

Python puede imprimir fácilmente sus estructuras de datos como JSON :

(require 'json)
(require 'python)
(json-read-from-string
 (substring
  (python-shell-send-string-no-output
   "import inspect, json; json.dumps (inspect.getargspec (json.dumps))"
   (run-python))
  1 -1))
==>
[["obj" "skipkeys" "ensure_ascii" "check_circular" "allow_nan"
  "cls" "indent" "separators" "encoding" "default" "sort_keys"]
 nil "kw" [:json-false t t t nil nil nil "utf-8" nil :json-false]]
sds
fuente