Seite 1 von 1
eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 16:18
von kitebuggy
Hallo
Ich habe in QtDesigner 28 slider erzeugt, die ich mittels self.ui.spslider_1 bis self.ui.spslider_28 ansprechen kann.
Deßhalb benutze ich eine for-Schleife, um diese mit den Werten aus einen dict zu verschieben:
Code: Alles auswählen
for a in range(1,28):
command='self.ui.spslider_{}.setValue(int(self.CVa.get(str(a))))'.format(a-66) # a is the key
eval(command)
Das funktioniert sogar

, aber meine Frage: Gibt es keinen eleganteren Weg, das zu realisieren d.h. ohne eval durch die Schleife zu iterieren?
Denn wenn ich die Zeile ohne eval() direkt in die Schleife schreibe, d.h.:
Code: Alles auswählen
for a in range(1,28):
self.ui.spslider_a.setValue(int(self.CVa.get(str(a)))) # a is the key
kriege ich folgende Fehlermeldung:
AttributeError: 'Ui_lenzstandardplusv2' object has no attribute 'spslider_a'
Danke
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 16:51
von Sirius3
Idealerweise hast Du ja gar keine 28 einzelne Attribute, sondern eine Liste.
Dann sähe das so aus:
Code: Alles auswählen
for n, slider in enumerate(self.spsliders, 1):
slider.setValue(int(self.CVa.get(str(n)))
Notfalls kann man diese Liste aus den ui.spslider_.. per getattr erzeugen:
Code: Alles auswählen
self.spsliders = [getattr(self.ui, f"spslider_{n}" for n in range(1, 28)]
Komisch ist dieses CVA. Was ist das für ein Objekt und woher kommt das?
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 17:17
von kitebuggy
CVa ist ein dict
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 17:36
von kitebuggy
Ja, fubktioniert und sieht besser aus.
Dies ist ein kleines Projekt von mir, um Dekoder in einem Modellzug zu programmieren und Erfahrung zu sammeln.
Danke, hat mir geholfen.
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 17:39
von Sirius3
Und warum hast Du ein dict mit den Keys "1" bis "28"? Besser wäre eine einfache Liste. Das ergibt dann:
Code: Alles auswählen
for slider, value in zip(self.spsliders, self.cva):
slider.setValue(value)
Wobei cva natürlich ein sehr schlecher Variablenname ist, weil er nichts aussagt.
Re: eval vermeiden [gelöst]
Verfasst: Mittwoch 8. Mai 2024, 18:57
von kitebuggy
Doch, CV sagt etwas aus.. Das sind die Variablen, welche man im Decoder setzen kann. CV ist ein dict mit den CVNamen und CVa das veränderliche dict. Die CV's haben auch keine kontinuierlichen Namen, so folgt z.B. auf CV9 bei Lenz Dekodern CV17. CVa beinhaltet die Werte, die angezeigt werden, CV sind defaultweerte.
Auch habe ich die Erfahrung gemacht, dass das Suchen nach einem guten Variablennamen oftg mehr Zeit benötigt, als das eigentliche Programmieren :--)
Danke jedenfalls
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 19:07
von narpfel
@kitebuggy: Warum brauchen deine Modellzüge denn einen Lebenslauf? Oder ist das der Modelllebenslauf vom Modelllokführy?
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 19:14
von kitebuggy
Welchen Lebenslauf?
Mit den Variablen des Dekoders können verschiedene Eigenschaften der Lokomotive eingestellt werden.
https://www.modellbahn.net/index.php/st ... nd-einfach
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 19:28
von Sirius3
Ich habe die Erfahrung gemacht, dass man in einem Programm mit schlechten Variablennamen keinen Fehler suchen kann, man schmeißt also das ganze Programm weg und schreibt es neu. Bis man wieder merkt, dass es einen Fehler hand und so geht es wieder von vorne los.
Ich kann nur aus Deinem Code lesen, dass CVa offensichtlich die Strings "1" bis "27" enthält, und keine Lücke zwischen "9" und "17" existiert. Wäre das nämlich der Fall, würde Dein Programm nicht funktionieren.
Und CV steht für configuration_variable, ein einfaches Wort, und wir hätten uns die ganze Verwirrung gespart. Wofür das a bei CVa wohl steht?
Re: eval vermeiden
Verfasst: Mittwoch 8. Mai 2024, 20:48
von __blackjack__
@kitebuggy: CV ist die übliche Abkürzung für „Curriculum Vitae“, was eine übliche Bezeichnung für den Lebenslauf bei Bewerbungen ist.
Das finden von guten Namen gehört zum Programmieren dazu. Es gibt nicht das “eigentliche Programmieren“ und das finden von guten Namen getrennt davon.