Seite 1 von 1

'line too long' abstellen bei vielen loops ?

Verfasst: Mittwoch 13. Mai 2020, 20:36
von HeinzBacker
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}")
                        
                        ....

Re: 'line too long' abstellen bei vielen loops ?

Verfasst: Mittwoch 13. Mai 2020, 21:01
von Sirius3
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?

Re: 'line too long' abstellen bei vielen loops ?

Verfasst: Mittwoch 13. Mai 2020, 21:08
von __deets__
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.

Re: 'line too long' abstellen bei vielen loops ?

Verfasst: Mittwoch 13. Mai 2020, 21:47
von HeinzBacker
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.

Re: 'line too long' abstellen bei vielen loops ?

Verfasst: Mittwoch 13. Mai 2020, 21:48
von sparrow
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.

Re: 'line too long' abstellen bei vielen loops ?

Verfasst: Donnerstag 14. Mai 2020, 06:04
von Sirius3
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)

Re: 'line too long' abstellen bei vielen loops ?

Verfasst: Donnerstag 14. Mai 2020, 13:17
von __blackjack__
@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.