Biblioteca que converte uma sequência de saída Python em uma estrutura de dados Elisp?

7

Digamos que avalio o seguinte código 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)]

Gostaria de transformar a string de saída, que é simplesmente a saída de impressão do Python, em uma estrutura de dados Elisp. Então, eu preciso de uma função foo que faz isso:

(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))

Embora não seja difícil escrever uma versão fooque funcione para essa instância específica, pergunto-me se há uma biblioteca que faça isso de maneira genérica, ou seja, é capaz de lidar com qualquer estrutura complexa do Python.

abo-abo
fonte

Respostas:

8

Use JSON, não sintaxe Python

O que você está procurando é json.elque faz parte do Emacs.

Observe que ele não lerá o formato Python OOTB; existem pelo menos três problemas:

  1. 'foo' não é reconhecido como uma sequência
  2. palavras-chave true/ false/ nullsão reconhecidas em vez de True/ False/None
  3. tuplas (1,"bar")não são reconhecidas

Solução completa usando json.dumps em Python

O Python pode imprimir facilmente suas estruturas de dados 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
fonte