Variablen nicht sofort ausführen lassen

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
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Guten Abend
Ich möchte die Pins des RaspberryPi ansteuern und habe dazu ein kleinen Server geschrieben. Dieser dieser nimmt die Zahlen von 1-17 an und soll dementsprechend die Pins aktivieren. Die ganze Überprüfung sieht so aus:

Code: Alles auswählen

for i in range(1, 18):
        if data in str(i):
            if status[i] == 0:
                print('Pin Nummer: ' + str(i) + ' AN')
                #GPIO.output(3, GPIO.HIGH)
                PinAn[i-1]
                status[i] = 1
                break
                
            else:
                print('Pin Nummer: ' + str(i) + ' AUS')
                GPIO.output(3, GPIO.LOW)
                status[i] = 0
                break
Um nicht 17 Abfragen schreiben zu müssen möchte ich das die Methoden in einem Array liegen. Diese haben aber jeweils andere Parameter. Nur wenn ich das ganze an den Anfang setze werden alle Pins schon eingeschaltet wie bekomme ich es jetzt so hin das, dass die Methoden erst dann aufgerufen werden wenn ich sie brauche?
Das Array:

Code: Alles auswählen

PinAn = [GPIO.output(3, GPIO.HIGH), GPIO.output(5, GPIO.HIGH), GPIO.output(7, GPIO.HIGH), GPIO.output(8, GPIO.HIGH), GPIO.output(10, GPIO.HIGH), GPIO.output(11, GPIO.HIGH), GPIO.output(12, GPIO.HIGH), GPIO.output(13, GPIO.HIGH), GPIO.output(15, GPIO.HIGH), GPIO.output(16, GPIO.HIGH)]
PinAus = [GPIO.output(3, GPIO.LOW), GPIO.output(5, GPIO.LOW), GPIO.output(7, GPIO.LOW), GPIO.output(8, GPIO.LOW), GPIO.output(10, GPIO.LOW), GPIO.output(11, GPIO.LOW), GPIO.output(12, GPIO.LOW), GPIO.output(13, GPIO.LOW), GPIO.output(15, GPIO.LOW), GPIO.output(16, GPIO.LOW)]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Die Lösung ist doch ganz einfach: wenn du etwas nicht ausführen möchtest, dann mach es einfach nicht ;-)

Code: Alles auswählen

PinAn = [(3, GPIO.HIGH), (5, GPIO.HIGH), (7, GPIO.HIGH), (8, GPIO.HIGH), ...]
PinAus = [(3, GPIO.LOW), (5, GPIO.LOW), (7, GPIO.LOW), (8, GPIO.LOW), ...]
Wenn du jetzt die Funktion mit bestimmten Parametern ausführen willst, dann holst du dir diese einfach aus den Listen:

Code: Alles auswählen

GPIO.output(*PinAn[2])
Das Leben ist wie ein Tennisball.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Ohhh Gott ja und ich hatte durch Googlen Referenz auf Funktionen in Betracht gezogen und war mir schon die Haare am raufen, weil ich erweiteter Anfänger bin... Manchmal sieht man die einfachsten Lösungswege nicht Danke.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

audacity363 hat geschrieben:Ohhh Gott ja und ich hatte durch Googlen Referenz auf Funktionen in Betracht gezogen
In dem Zusammenhang solltest du dir functools.partial anschauen. Damit kannst du Parameter einer Funktion setzen und diese dann später ausführen. Das wäre hier zwar zu umständlich, ist an anderen Stellen aber oft sehr nützlich.

Code: Alles auswählen

import functools

#Parameter an Funktion binden
func = functools.partial(GPIO.output, 3, GPIO.HIGH)

#Funktion mit gebundenen Parametern ausführen:
func()
Das Leben ist wie ein Tennisball.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Okey Danke habe mir jetzt einfach mal ne Hilf Datei mit deiner Vorschlag gemacht und hebe diese dann für schlechte Zeiten auf :)
BlackJack

@audacity363: Wobei ich die *beiden* Listen unsinnig finde. Die Unterscheiden sich doch nur dadurch, das in einer das zweite Element ein anderes ist, aber in der ganzen Liste immer den selben Wert hat. Irgendwo musst Du ja entscheiden welche der beiden Listen Du verwenden willst. An der Stelle könntest Du auch einfach entscheiden was der zweite Wert in den Tupeln ist, und nur noch *eine* Liste mit den Pin-Nummern für beide Fälle speichern.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Stimmt da hast du Recht habe es geändert.
Antworten