Seite 1 von 1

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

Verfasst: Donnerstag 22. März 2018, 15:43
von gotridofmyphone
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

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

Verfasst: Donnerstag 22. März 2018, 15:48
von Sirius3
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.

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

Verfasst: Donnerstag 22. März 2018, 16:52
von gotridofmyphone
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.