Seite 1 von 1
Aliasnamen
Verfasst: Freitag 12. Mai 2017, 07:10
von tomy7om
Moin Moin,
...ich hätte da jetzt noch eine Frage - nachdem ich mit den Zufallszahlen erfolgreich war, und ihr mir super helfen konntet...
In dem Code frage ich, an anderer Stelle, Eingänge (Taster) über I2C ab - und möchte hier abfragen, welcher Taster (S1 - S6) betätigt ist. Das funktioniert ja alles - aber gibt es eine Möglichkeit, hier anstatt "0xfe" z.B. "S1" etc. abzufragen?!?
...der besseren Übersicht bzw. Lesbarkeit wegen...
Danke und Gruß, Tom
Code: Alles auswählen
##### Taster (der Reihenfolge) und Vorgängerschritt
if SR2 == 1 and ((Taste == 0xfe and R1 == 1) or (Taste == 0xfd and R1 == 2) or (Taste == 0xfb and R1 == 3) or(Taste == 0xf7 and R1 == 4) or (Taste == 0xef and R1 == 5) or (Taste == 0xdf and R1 == 6)):
SR3 = 1
SR2 = 0
if SR3 == 1 and R2 == 1:
P1 = 1
if SR3 == 1 and R2 == 2:
P2 = 1
if SR3 == 1 and R2 == 3:
P3 = 1
if SR3 == 1 and R2 == 4:
P4 = 1
if SR3 == 1 and R2 == 5:
P5 = 1
if SR3 == 1 and R2 == 6:
P6 = 1
break
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 09:28
von noisefloor
Hallo,
was meinst du genau mit "aber gibt es eine Möglichkeit, hier anstatt "0xfe" z.B. "S1" etc. abzufragen?"
0xfe ist ja "nur" eine Zahl in Hexadezimal-Darstellung, "S1" wäre ein String.
Gruß, noisefloor
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 10:08
von tomy7om
...die "0xfe" ist ja der Wert, den mir der I2c-Bus als Eingang gibt.
Ich wollte jetzt im Code, der Lesbarkeit wegen, aber gerne "S1" stehen haben...
Wie erkläre ich dem Programm dass "S1" dem Wert "0xfe" entspricht?!
...ich hatte es dann so versucht zu deklarieren
Code: Alles auswählen
S={"S0":0xff, "S1":0xfe, "S2":0xfd, "S3":0xfb, "S4":0xf7, "S5":0cef, "S6":0xdf, "S7":0xbf} # Schalter Aliasnamen
und so, abzufragen (Zeile 2)
Code: Alles auswählen
##### Abfrage Startfeld (S7) und Reihenfolge
if Taste == S[1]:
SR1 = 1
if SR1 == 1 and R1 == 1:
P1 = 1
hat aber leider nicht geklappt...
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 10:14
von Liffi
S ist keine Liste. Die Benutzung wäre dann eher S["S0"].
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 10:33
von noisefloor
Hallo,
der Ansatz ist mit einem Dictionary ist schon richtig - nur musst du, wie von Liffi schon gezeigt, auf ein Dictionary mit einem Schlüssel zugreifen, nicht per Index.
Gruß, noisefloor
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 10:41
von tomy7om
Super, Danke...
habs eben mit nem Testprogramm (ohne Busanbindung) probiert - funzt.
Heute Abend wirds dann am "echten" Programm probiert; wobei ich da jetzt bester Dinge bin
Gruß, Tom
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 10:50
von Sirius3
@tomy7om: ich würde das hier eher als Konstanten ansehen, da die Zuordnung Taste -> Wert fix ist:
Code: Alles auswählen
KEY_S0 = 0xff
KEY_S1 = 0xfe
KEY_S2 = 0xfd
KEY_S3 = 0xfb
KEY_S4 = 0xf7
KEY_S5 = 0xce
KEY_S6 = 0xdf
KEY_S7 = 0xbf
if Taste == KEY_S2:
...
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 12:23
von tomy7om
...bekomme ich das auch irgendwie in eine Zeile geschrieben??
Ich weiß, da geht es jetzt rein um Optik...

Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 12:30
von BlackJack
@tomy7om: Kann man, sollte man IMHO aber nicht. Rein wegen der Optik. So sieht das mehr nach einer tabellarischen Zuordnung aus und man sieht sehr leicht welcher Wert und welcher Name zusammen gehören.
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 13:32
von noisefloor
Hallo,
reiner wegen der Optik schreibt man es eben _nicht_ in eine Zeile. Zumal die PEP8, also der Style Guide für Python, eine Zeilenlänge von max 79 Zeichen vorschlägt. In "schönem" Code würde man auch das Dictionary so schreiben:
Gruß, noisefloor
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 17:12
von pillmuncher
Ich würd's ja so schreiben:
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 22:07
von bwbg
DIe ganze Lesbarkeitsdebatte hat allerdings einen Haken. Sie berücksichtigt nicht, dass hier potentiell schlecht wartbarer Code entsteht. Zunächst werden die rein numerischen Werte auf "lesbare" Zeichenketten abgebildet um diese dann wiederum durch ein if-else-Konstrukt auf die eigentliche Funktionalität abzubilden.
Mein Vorschlag wäre, die numerischen Werte direkt auf die Funktionalität abzubilden, in dem direkt Funktionen als Werte eines dictionary verwendet werden:
Code: Alles auswählen
def foo():
print('do foo')
def bar():
print('do bar')
def barfoos():
print('do barfoos')
def baz():
print('do baz')
actions = {
0xff: foo,
0xfe: bar,
0xfd: barfoos,
0xfb: baz,
}
actions[choice]()
Re: Aliasnamen
Verfasst: Freitag 12. Mai 2017, 23:17
von BlackJack
@bwbg: Wobei das mit den magischen Zahlen als Schlüssel echt nicht gut verständlich ist. Ausserdem möchte man vielleicht allen Werten Namen geben, auch solchen die (noch) nicht verwendet werden.