Seite 1 von 1

Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Dienstag 8. Februar 2022, 15:55
von peha01
Hallo,
bin neu hier und versuche seit 2-3 Wochen Python zu lernen. Grundsätzlich ist fast alles klar bis auf folgendes:
Zuerst mal mein Test-Code:
_____________________________________
from gpiozero import LED

# sprechenden Zeiger auf Objekt
led_rot = LED(25)
led_gelb = LED(8)
led_gruen = LED(7)

led_used = ["led_rot", "led_gelb", "led_gruen"]

# alle benutzten ausmachen ausmachen
def leds_off(led):
''' in Liste werden Strings übergeben, welche die
LEDs als Namen enthalten, welche hier ausgeschaltet
werden sollen
'''

for i in range(0, len(led)):
print(led)
xyz = led + ".off()"
print(xyz)
# in xyz steht nun das Stringliteral
# led_rot.off() drinne
# wie mache ich es, dass der String xyz als Zeiger
# auf das Objekt led_rot.off() funktioniert??
xyz # ausmachen, so funktioniert es nicht
led_rot.off() # aber so funktioniert es

led_rot.on()

leds_off(led_used)
--------------------------------------------------------------------------

Ab 4. letzter Zeile?????
Kann mir da jemand bitte auf die Sprünge helfen?

:roll:

Danke schon mal

Re: Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Dienstag 8. Februar 2022, 16:15
von __deets__
Wenn du eine Zuordnung von Namen zu Objekten willst, dann ist ein Woerterbuch die Antwort.

Code: Alles auswählen

leds_by_name = {
   "rot": led_rot,
    ...
}
leds_by_name[led_name].off()

Re: Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Dienstag 8. Februar 2022, 17:01
von peha01
Hallo __deets__

vieeelen Dank für die zackige Antwort. der Aufruf funktioniert :!:

Habe mich jetzt mal in das Wörterbuch eingelesen.
Wollte nun mal den Inhalt meines Wörterbuches mit

list(leds_by_name.keys())

ausgeben. Nur es erfolgte KEINE Ausgabe.
Hast Du dafür auch eine Begründung?

Re: Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Dienstag 8. Februar 2022, 17:18
von sparrow
Damit erstellst du eine Liste der Keys. Ausgegeben werden sie aber ohne print-Befehl nicht.

Re: Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Dienstag 8. Februar 2022, 17:25
von __deets__
print(leds_by_name) sollte eigentlich reichen. Aber anders als hingeschrieben sieht das auch nicht aus.

Re: Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Dienstag 8. Februar 2022, 20:11
von peha01
Hat funktioniert.

Vielen Dank für die schnelle Antwort.

Re: Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Dienstag 8. Februar 2022, 21:37
von __blackjack__
@peha01: Der Kommentar „sprechennden Zeiger“ ist ein bisschen irreführend, denn das sind sprechende Namen. Und Zeiger gibt es in Python als nicht als Datentyp, das ist etwas was in den Bereich der Implementierung gehört. Es gibt Objekte.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Das Funktionsargument `led` — Einzahl! – zu nennen ist irreführend. Insbesondere wenn man *in* der Funktion dann eigentlich einen Namen für *eine* LED aus dem Argument bräuchte.

``for i in range(len(sequence)):`` nur um dann `i` als Index in die Sequenz zu verwenden ist in Python ein „anti pattern“. Man kann direkt über die Elemente von Sequenzen iterieren, ohne den unnötigen Umweg über einen Index. Falls man *zusätzlich* eine laufende ganze Zahl benötigt, gibt es die `enumerate()`-Funktion.

Warum hantierst Du da überhaupt mit Zeichenketten? Es wäre hier viel einfacher einfach eine Liste mit den LEDs anzulegen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from gpiozero import LED


def leds_off(leds):
    for led in leds:
        print(led)
        led.off()


def main():
    rote_led = LED(25)
    gelbe_led = LED(8)
    gruene_led = LED(7)
    used_leds = [rote_led, gelbe_led, gruene_led]
    rote_led.on()
    leds_off(used_leds)


if __name__ == "__main__":
    main()

Re: Variablen soll eine Referenz auf eine Objektfunktion bekommen

Verfasst: Mittwoch 9. Februar 2022, 15:35
von peha01
Klasse Lösung, vielen Dank.
Mit Deinem Beispiel habe ich jetzt noch nebenher die Funktion __main__() verstanden. :P