Wie erkenne ich Instanzen von lxml.etree._Element? (gesucht: etwas ohne Unterstrich)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gotridofmyphone
User
Beiträge: 33
Registriert: Mittwoch 15. März 2017, 08:54

Wie erkennt man Elemente von lxml.etree, um sie speziell zu behandeln gegenüber strings und Listen? Eindeutig ja doch mit isinstance(obj, lxml.etree._Element), oder? Das Problem, dass ich damit habe, ist der Underscore, der mich anschreit: "Ich bin eine private Klasse, nicht Teil der öffentlichen API von lxml.etree. Wenn du mich verwendest, brauchst du dich nicht wundern, wenn dein eines Tages nicht mehr funktioniert".

Wisst ihr eine Alternative?

Hier ein minimales Beispiel des Codes, ich hoffe er reicht, um den Kontext zu verstehen:

Code: Alles auswählen

def dict_to_xml(root, d, valueresolver=lambda x: x):
    """ Recursively translates a dictionary of xpath-like expressions as keys
         and text or substructure(s) as values into XML
    """

    if isinstance(d, str):
        root.text = d
        return
    elif isinstance(d, etree._Element):
        root.append(d)
        return
    else:
        pass

    # more code, e.g. to process the special-syntax keys that represent not only a single element,
    # but elements that can be nested in other elements to be created if needed as well.

    # recurse into dictionary and list instances as values
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

es gibt die Funktion `iselement`. Generell sollte man Situationen vermeiden, wo verschiedene Typen an einer Stelle landen, wo man sie dann mühsam wieder auseinandersortieren muß. Entweder man hat ein Wörterbuch mit Werten, oder man hat einen XML-Baum, aber nicht beides gemischt. Die `return` sind und sollten überflüssig sein.
gotridofmyphone
User
Beiträge: 33
Registriert: Mittwoch 15. März 2017, 08:54

Wenn es ein XML-Element gibt in einer Datenstruktur, die nach XML serialisiert werden soll, ist das auch eher die Ausnahme als die Regel. Aber es kann halt sein, das die Gesamtstruktur fertige XML-Fragmente enthalten soll.

Danke, etree.iselement() tut, was ich wünsche.

Die return lassen die Funktion früh zurückkommen. Daher auch das pass im else-Block - danach geht es auf gleicher Ebene weiter. So spare ich mir Einrückungsebenen. ich könnte mir das else: pass auch sparen, aber spätestens dann wird es wohl unübersichtlich. Aber es ist eigentlich jetzt schon nicht gerade übersichtlich, ich sollte schreiben

Code: Alles auswählen

else:
    return recurse_substructure(...)
... und den Rest in eine eigene Funktion auslagern, hm.
Antworten