[PYTHON] Verwenden Sie benutzerdefinierte Tags mit PyYAML

Als ich nachgeschlagen habe, gab es keine Proben (auch nicht in englischsprachigen Ländern!), Also war es einfach.

Auslösen

Ich habe Code in Python geschrieben, der das Verhalten eines Programms in YAML definiert, und ich wollte nur einen Prozess schreiben, um ein Objekt in YAML zu erstellen.

Soweit ich PyYAMLDocumentation sehen kann, gibt es ein ** Tag **, das zu tun scheint, was ich will, aber es gibt nirgendwo ein Verwendungsbeispiel. Ich weiß nicht, ob es verwendet werden soll oder wie ich es definieren soll. Nun, ich war in Schwierigkeiten.

So fügen Sie ein Tag hinzu

Also ist es plötzlich das Hauptthema. Übergeben Sie zum Hinzufügen eines Tags einen Wert an die globale Funktion des PyYAML-Moduls, "add_multi_constructor ()".

  yaml.add_multi_constructor("tag:yaml.org,2002:var", var_handler)

  # ...

  def var_handler(loader, suffix, node=None):
    #wird bearbeitet

Wenn Sie einen solchen Code schreiben, reagiert er, wenn die YAML-Datei das folgende Tag hat und "var_handler" aufgerufen wird.

  textvariable: !!var:StringVar
    name: label
    default: ""

Drei Parameter werden an die im Argument angegebene Funktion übergeben

Wenn Sie also einen Wert als Rückgabewert der Funktion zurückgeben, ist der Tag-Teil der für den Rückgabewert angegebene Wert. Im obigen Beispiel entspricht die Rückgabe des Wortes "Ja" dem Schreiben von "textvariable: Yes".

Wenn Sie dem Verhalten der Funktion add_multi_constructor () folgen, wird die hier angegebene Funktion den drei Klassen Loader, FullLoader und UnsafeLoader hinzugefügt, wenn Sie den als Schlüsselwortargument definierten Loader weglassen. Wenn Sie also SafeLoader verwenden, ** wird unabhängig davon, was Sie hier tun, keine Funktion hinzugefügt. ** ** **

Wenn Sie nur Tags verwenden möchten, die Sie in YAML definiert haben

Wenn Sie beim Lesen von YAML nur die Tags lesen möchten, die Sie selbst definiert haben, können Sie eine Funktion hinzufügen, indem Sie SafeLoader als Argument angeben.

Ich hatte einen anderen Prozess und war ein wenig besorgt darüber, direkt mit SafeLoader zu spielen. Deshalb habe ich eine neue Klasse definiert, die SafeLoader geerbt hat.

class GeneratorLoader(yaml.SafeLoader):
  def __init__(self, stream):
    super().__init__(stream)
    yaml.add_multi_constructor("tag:yaml.org,2002:var", GeneratorLoader.var_handler,
      Loader=GeneratorLoader)

  @staticmethod
  def var_handler(loader, suffix, node=None):
    pass

Wenn Sie die hier erstellte Klasse als Loader in der Methode yaml.load () verwenden, werden die Tags verarbeitet.

Globale PyYAML-Funktionen haben keine Funktion, die eine Instanz von Loader empfängt

Beachten Sie, dass die in \ _ \ _ init \ _ \ _. Py von PyYAML definierten Funktionen wie yaml.load () keine Funktion haben, die eine Instanz von Loader empfängt (alle Empfangsklassen). Wenn Sie das oben erstellte Loader-Objekt nach dem Laden von YAML verwenden möchten, müssen Sie daher direkt Loader # get_single_data () aufrufen.

loader = GeneratorLoader(self.string)
struct = loader.get_single_data()

Weitere Hinweise

Ich verstehe die Erklärung nicht, also zeig mir vorerst den Code

Ich arbeite gerade daran, aber ich verwende es im nächsten Modul.

Ab dem 21. September 2020 gibt es einen solchen Prozess in tksugar / generator.py (kann den Code später verschieben).

Verweise

Recommended Posts

Verwenden Sie benutzerdefinierte Tags mit PyYAML
Verwenden Sie einen benutzerdefinierten Kernel mit WSL2
Verwenden Sie RTX 3090 mit PyTorch
Verwenden Sie ansible mit cygwin
Verwenden Sie pipdeptree mit virtualenv
[Python] Verwenden Sie JSON mit Python
Verwenden Sie Mock mit Pytest
Verwenden Sie den Indikator mit pd.merge
Verwenden Sie Gentelella mit Django
Verwenden Sie Mecab mit Python 3
Verwenden Sie Tensorboard mit Chainer
Verwenden Sie DynamoDB mit Python
Verwenden Sie pip mit MSYS2
Verwenden Sie Python 3.8 mit Anaconda
Verwenden Sie Copyright mit Spacemacs
Verwenden Sie Python mit Docker
Verwenden Sie TypeScript mit Django-Kompressor
Verwenden Sie WENIGER mit Django
Verwenden Sie MySQL mit Django
Verwenden Sie Enum mit SQLAlchemy
Verwenden Sie Tensorboard mit NNabla
Verwenden Sie GPS mit Edison
Verwenden Sie nim mit Jupyter
Verwenden Sie die Trello-API mit Python
Verwenden Sie gemeinsam genutzten Speicher mit gemeinsam genutzten Bibliotheken
Verwenden Sie Richtungsdiagramme mit networkx
Verwenden Sie TensorFlow mit Intellij IDEA
Verwenden Sie die Twitter-API mit Python
Verwenden Sie pip mit Jupyter Notebook
Verwenden Sie DATE_FORMAT mit dem SQLAlchemy-Filter
Verwenden Sie TUN / TAP mit Python
Verwenden Sie sqlite3 mit NAO (Pepper)
Verwenden Sie die load_extensions von sqlite mit Pyramid
Verwenden Sie Windows 10-Schriftarten mit WSL
Verwendung von Chainer mit Jetson TK1
Verwenden Sie SSL mit Sellerie + Redis
Verwenden Sie Cython mit Jupyter Notebook
Erstellen Sie benutzerdefinierte Regeln mit ElastAlert
Verwenden Sie Maxout + CNN mit Pylearn2
Verwenden Sie WDC-433SU2M2 mit Manjaro Linux
Verwenden Sie OpenBLAS mit numpy, scipy
Verwenden Sie die Unterschall-API mit Python3
Verwenden von Sonicwall NetExtener mit Systemd
Verwenden Sie prefetch_related bequem mit Django
Verwenden Sie einen AWS-Interpreter mit Pycharm
Verwenden von Bokeh mit IPython Notebook
Verwenden Sie Python-ähnliche Bereiche mit Rust
Verwenden Sie MLflow mit Databricks ④ - Anrufmodell -
Python: So verwenden Sie Async mit
Verwenden Sie eine Point Grey-Kamera mit Python (PyCapture2).
Verwenden Sie vl53l0x mit RaspberryPi (Python)
Verwenden Sie PX-S1UD / PX-Q1UD mit Jetson Nano
Verwenden Sie die Vorschaufunktion mit aws-cli
So verwenden Sie virtualenv mit PowerShell
Verwenden Sie NAIF SPICE TOOL KIT mit Python
Verwenden Sie rospy mit virtualenv in Python3
Verwenden Sie benutzerdefinierte Python-Skripte mit StackStorm
Markdown mit Jupyter-Notebook verwenden (mit Verknüpfung)