eval vermeiden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
kitebuggy
User
Beiträge: 34
Registriert: Donnerstag 5. August 2021, 21:11

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
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
kitebuggy
User
Beiträge: 34
Registriert: Donnerstag 5. August 2021, 21:11

CVa ist ein dict
kitebuggy
User
Beiträge: 34
Registriert: Donnerstag 5. August 2021, 21:11

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.
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
kitebuggy
User
Beiträge: 34
Registriert: Donnerstag 5. August 2021, 21:11

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
narpfel
User
Beiträge: 646
Registriert: Freitag 20. Oktober 2017, 16:10

@kitebuggy: Warum brauchen deine Modellzüge denn einen Lebenslauf? Oder ist das der Modelllebenslauf vom Modelllokführy?
kitebuggy
User
Beiträge: 34
Registriert: Donnerstag 5. August 2021, 21:11

Welchen Lebenslauf?

Mit den Variablen des Dekoders können verschiedene Eigenschaften der Lokomotive eingestellt werden.

https://www.modellbahn.net/index.php/st ... nd-einfach
Sirius3
User
Beiträge: 17792
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13186
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten