Seite 1 von 1

Variablen nicht sofort ausführen lassen

Verfasst: Dienstag 6. August 2013, 19:45
von audacity363
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)]

Re: Variablen nicht sofort ausführen lassen

Verfasst: Dienstag 6. August 2013, 19:59
von EyDu
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])

Re: Variablen nicht sofort ausführen lassen

Verfasst: Dienstag 6. August 2013, 20:12
von audacity363
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.

Re: Variablen nicht sofort ausführen lassen

Verfasst: Dienstag 6. August 2013, 20:20
von EyDu
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()

Re: Variablen nicht sofort ausführen lassen

Verfasst: Dienstag 6. August 2013, 20:24
von audacity363
Okey Danke habe mir jetzt einfach mal ne Hilf Datei mit deiner Vorschlag gemacht und hebe diese dann für schlechte Zeiten auf :)

Re: Variablen nicht sofort ausführen lassen

Verfasst: Dienstag 6. August 2013, 21:39
von 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.

Re: Variablen nicht sofort ausführen lassen

Verfasst: Mittwoch 7. August 2013, 08:27
von audacity363
Stimmt da hast du Recht habe es geändert.