Variablen soll eine Referenz auf eine Objektfunktion bekommen

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
peha01
User
Beiträge: 7
Registriert: Dienstag 8. Februar 2022, 15:38

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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()
peha01
User
Beiträge: 7
Registriert: Dienstag 8. Februar 2022, 15:38

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?
Benutzeravatar
sparrow
User
Beiträge: 4245
Registriert: Freitag 17. April 2009, 10:28

Damit erstellst du eine Liste der Keys. Ausgegeben werden sie aber ohne print-Befehl nicht.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

print(leds_by_name) sollte eigentlich reichen. Aber anders als hingeschrieben sieht das auch nicht aus.
peha01
User
Beiträge: 7
Registriert: Dienstag 8. Februar 2022, 15:38

Hat funktioniert.

Vielen Dank für die schnelle Antwort.
Benutzeravatar
__blackjack__
User
Beiträge: 13270
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
peha01
User
Beiträge: 7
Registriert: Dienstag 8. Februar 2022, 15:38

Klasse Lösung, vielen Dank.
Mit Deinem Beispiel habe ich jetzt noch nebenher die Funktion __main__() verstanden. :P
Antworten