Bibliothek, die eine Python-Ausgabezeichenfolge in eine Elisp-Datenstruktur konvertiert?

7

Angenommen, ich bewerte den folgenden Python-Code:

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

Ich möchte die Ausgabezeichenfolge, die einfach Pythons Druckausgabe ist, in eine Elisp-Datenstruktur umwandeln. Ich brauche also eine Funktion foo , die dies tut:

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

Es ist zwar nicht schwer, eine Version zu schreiben foo, die für diese bestimmte Instanz funktioniert, aber ich frage mich, ob es eine Bibliothek gibt, die dies generisch tut, dh mit jeder komplexen Python-Struktur umgehen kann.

abo-abo
quelle

Antworten:

8

Verwenden Sie JSON, nicht die Python-Syntax

Was Sie suchen json.el, ist ein Teil von Emacs.

Beachten Sie, dass das Python-Format OOTB nicht gelesen wird. Es gibt mindestens 3 Probleme:

  1. 'foo' wird nicht als Zeichenfolge erkannt
  2. Schlüsselwörter true/ false/ nullerkannt statt True/ False/None
  3. Tupel (1,"bar")werden nicht erkannt

Vollständige Lösung mit json.dumps in Python

Python kann seine Datenstrukturen einfach als JSON drucken :

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