Aliasnamen

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
tomy7om
User
Beiträge: 7
Registriert: Dienstag 9. Mai 2017, 06:31

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
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
tomy7om
User
Beiträge: 7
Registriert: Dienstag 9. Mai 2017, 06:31

...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...
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

S ist keine Liste. Die Benutzung wäre dann eher S["S0"].
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
tomy7om
User
Beiträge: 7
Registriert: Dienstag 9. Mai 2017, 06:31

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 :wink:

Gruß, Tom
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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:
    ...
tomy7om
User
Beiträge: 7
Registriert: Dienstag 9. Mai 2017, 06:31

...bekomme ich das auch irgendwie in eine Zeile geschrieben??

Ich weiß, da geht es jetzt rein um Optik... :shock:
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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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:

Code: Alles auswählen

S={"S0":0xff,
   "S1":0xfe,
   "S2":0xfd,
   "S3":0xfb}
Gruß, noisefloor
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Ich würd's ja so schreiben:

Code: Alles auswählen

S = dict(
    S0=0xff,
    S1=0xfe,
    S2=0xfd,
    S3=0xfb
)
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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]()
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
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.
Antworten