Als ich nachgeschlagen habe, gab es keine Proben (auch nicht in englischsprachigen Ländern!), Also war es einfach.
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.
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
: StringVar
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 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.
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()
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).
Recommended Posts