'line too long' abstellen bei vielen loops ?

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
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

Hi,

ich habe eine Klasse, die ein verschachteltes XML generieren soll. Es gibt also mehrere SubElemente untereinander.
Alles funktioniert auch super, nur ist es anscheinend nicht pythonic genug - der Linter meckert mit diesen Hinweisen:
C0301: Line too long (107/100) (line-too-long)
R0914: Too many local variables (19/15) (too-many-locals)
R0903: Too few public methods (1/2) (too-few-public-methods)

Vor allem will ich irgendwie das "line too long" abstellen.
Nur wie soll man das umgehen gehen, bei mehreren for-loops in meinem Fall? Hier kommt man natürlich irgendwann immer weiter nach rechts.

Und "too many local variables" resultiert wohl auch durch durch das hierarchische Anhäufen.

Seht unten den Code.


Danke im vorraus!



Code: Alles auswählen

class XmlWriter(): 

    def __init__(self, data):
        self.data = data       

    def create(self, filename):
        root = ET.Element("root")
        level_0_list = self.data.level_0_list
        
        for level_0_idx, level_0 in enumerate(level_0_list):
            subelem_level_0 = ET.SubElement(
                root, f"Level_0{level_0_idx}_{level_0.level_0_description}") 

            level_1_list = level_0.level_1_list
            for level_1_idx, level_1 in enumerate(level_1_list):
                subelem_level_1 = ET.SubElement(
                    subelem_level_1, f"Level_1{level_1_idx}_{level_1.level_1_description}") 

                level_2_list = level_1.level_2_list
                for level_2_idx, level_2 in enumerate(level_2_list):
                    subelem_level_2 = ET.SubElement(
                        subelem_level_2, f"Level_2{level_2_idx}_{level_2.level_2_description}")
                        
                        ....
Sirius3
User
Beiträge: 18225
Registriert: Sonntag 21. Oktober 2012, 17:20

Kannst Du mal beschreiben, was Du denn da für ein XML generieren willst? Das sieht nicht nach einem sinnvollen XML-Format aus.
Der eindeutigste Fehler ist der dritte. Das ist keine Klasse. Du hast eigentlich nur eine create_xml-Funktion. Lass die Klasse einfach weg.
Die anderen beiden sagen einfach nur, dass die Funktion zu lang und zu tief verschachtelt ist.
Aber dazu müßte man erst einmal wissen, was denn das für ein XML werden soll; wie schon geschrieben, sinnvoll sieht das nicht aus. Was ist Dein realer Anwendungsfall?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und selbst wenn das XML so beibehalten werden sollte, liegt die Loesung in Funktionen, die du zur Erzeugung von Unterbaeumen aufrufst. Und ggf. Template-Systemen.
HeinzBacker
User
Beiträge: 19
Registriert: Dienstag 10. März 2020, 20:20

ich habe mehrere Listen in einer Kompositions-Form :

Code: Alles auswählen

liste_level_0
   |____ liste_level_1
               |____ liste_level_2

Jede Liste hat n Objekte.
Und diese Form würde ich gern in XML darstellen.
Daher muss ich so drüber iterieren.

Habt ihr ein Muster-Beispiel, wie sowas korrekt geht? Was für ein Template?
Alles mit verschachtelten Funktionen kann ich mir grad nicht vorstellen.. leidet da nicht auch die Übersichtlichkeit?

OK, wie oben angemerkt könnte ich die Klasse weglassen und nur eine Fn machen.
Bleibt dann nur der "line too long" Error.
Benutzeravatar
sparrow
User
Beiträge: 4510
Registriert: Freitag 17. April 2009, 10:28

Und grundsätzlich gilt: Wenn man beginnt Variablen zu nummerieren ist etwas falsch.
Und die einzelnen Schleifen sind sich so ähnlich, dass sie, wie __deets__ bereits schrieb, in einer Funktion abgebildet werden können.
Sirius3
User
Beiträge: 18225
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast nicht mehrere Listen, sondern irgendwelche komischen Objekte, die nur ein Attribut level_0_description oder level_1_description, etc. haben. Wo sind die eigentlichen Daten? Was ist das für eine Datenstruktur? Woher kommt die?
Dass die Attribute pro Level unterschiedlich heißen, ist ein Designfehler. Das Level ergibt sich implizit, wie tief die Objekte in der Struktur stehen. Damit hast du immer die selbe Schleife, die immer gleich aussieht und rekursiv als Funktion aufgerufen werden kann. Dass die Tags im XML unterschiedlich heißen ist auch ein Designfehler des Formats. Die XML-Struktur gibt schon vor, in welcher Ebene in Tag steht, das muss nicht im Namen sein. Wenn die description eigentlich ein Tagname ist, kann man den benutzen, aber sonst ist das ein Attribut.

Code: Alles auswählen

def convert_level_to_xml(root, level):
    subelement = ET.SubElement(root, "level", description=level.description)
    for element in level.list:
        convert_level_to_xml(subelement, element)
Benutzeravatar
__blackjack__
User
Beiträge: 13930
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@HeinzBacker: Der Code ist auch nicht echt, denn `subelem_level_1` wird benutzt bevor es definiert ist, das wäre so also nicht lauffähig.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten