Dokumentation Packages

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo!

    Zu meinen folgenden Fragen: Eine Verweis auf Doku dazu reicht natürlich!


    hyle: Danke das hilft schon mal weiter, das hatte ich in meinem "Python für dummies" noch nicht gefunden. Vermutlich sind von der ellenlangen Auflistung (aufgerufen in Thonny) für mich wohl nur die Einträge ab "yield from walk_packages(path, info.name+'.', onerror) ´" interessant. Warum taucht dort RPi.GPIO nur als RPi auf?


    Mit help('<Modulname>') erhalte ich jetzt auch endlich die "manpages" zum Modul. Das ist doch schon mal eine Doku, wenn auch zum Teil reichlich komplex (für mich zu komplex).

    "help ('Rpi')" liefert: "Name RPI, Package Contents GPIO" Was bedeutet das nun wieder?

    Modul gpiozero hat ja diverse Einträge dort. Sind das Objektklassen? Wie finde ich in diesen "manpages" z.B. Hilfe zum Objekt "button" in "gpiozero" OHNE alle einzelnen "manpages" zu "gpiozero" durchzuprobieren?


    Dennis89: Ich hatte bisher gedacht: Mit dem Pi-Desktop und Thonny brauche ich mich mit Konsolenbefehlen nicht mehr abzugeben. Das scheint falsch zu sein, muss wohl doch mehr im Terminalfenster arbeiten.

    Gruss, wonk :danke_ATDE:

  • Wie finde ich in diesen "manpages" z.B. Hilfe zum Objekt "button" in "gpiozero" OHNE alle einzelnen "manpages" zu "gpiozero" durchzuprobieren?

    Hi wonk,


    Du hast doch bereits in #2 den Link zur wunderbar aufbereiteten Dokumentation von gpiozero bekommen. Die ist selbst für mich, der mit Python nix am Hut hat, sehr gut nachvollziehbar. Warum guckst Du da nicht rein?

  • Die ``help('RPi')`-Ausgabe bedeutet das der Name RPi ist, und der Package-Inhalt `GPIO`. Mehr ist in `RPi` nicht drin. Wenn Du wissen willst was in `RPi.GPIO` drin ist, dann musst Du *das* an `help()` übergeben.


    Die Texte die `help()` Ausgibt stammen aus den Modulen, beziehungsweise den Objekten die man `help()` übergibt. Bei Modulen/Packages wird beispielsweise geschaut was da in dem Namensraum definiert ist, und das wird dann aufgelistet. Neben den Dingen die `help()` durch Introspektion herausfinden kann (Datentypen, Funktions, und Methodensignaturen, …) werden auch die Docstrings ausgegeben. Also die Dokumentation, welche der oder die Autoren der Module in die Module selbst geschrieben haben.


    Bei `gpiozero` werden keine Klassen aufgelistet. Unter Package Contents stehen Module und Packages. Auch die kannst Du an `help()` übergeben. Und natürlich die Objekte in den Modulen selbst.


    Wenn Du die Hilfeseiten zu konkreten Objekten mal mit der Dokumentation vergleichst, sollte auffallen, dass da *das gleiche steht*. Weil Dokumentation in der Regel so geschrieben wird, dass zumindest die konkreten Module, Funktionen, Klassen, und Methoden im Quelltext mit Docstrings versehen sind, und deren Inhalt in der Dokumentation übernommen wird. Das will man ja nicht alles zweimal schreiben.


    Vergleiche einfach mal https://gpiozero.readthedocs.i…ble/api_input.html#button mit ``help(gpiozero.Button)`` und dass dann mit dem Quelltext in ``gpiozero/input_devices.py`` um eine Idee zu bekommen wie der Weg vom Quelltext zur Dokumentation aussieht.


    Falls man keinen Zugriff auf die Dokumentation hat, kann man sich die `help()`-Informationen auch lokal im Webbrowser anschauen über das `pydoc`-Modul aus der Standardbibliothek. Einfach mit ``python3 -m pydoc -n '' -p 8080`` einen Webserver starten der die Help-Texte ausliefert und im Browser dann beispielsweise zu ``http://rechnername_oder_ip:8080/gpiozero.input_devices.html#Button`` navigieren.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors

    • Official Post

    Warum taucht dort RPi.GPIO nur als RPi auf?

    Weil GPIO ein Verzeichnis unter dem Paket RPi ist, wie man hiermit ls -l /usr/lib/python3/dist-packages/RPi sieht.

    "help ('Rpi')" liefert: "Name RPI, Package Contents GPIO" Was bedeutet das nun wieder?

    help('RPi.GPIO') Zeigt Dir den Rest.



    //Edit __blackjack__ War schneller. :)

  • Hallo!

    zu #22: Weil es mir um das Prinzip und das Verständnis geht, damit ich es beim nächsten Mal selber kann.


    zu#23: Wenn ich das richtig verstehe, ist GPIO ein Subpackage (das Einzige) von RPi, entsprechend gibt es ein solches Unterverzeichnis.

    gpiozero hat keine Subpackages sondern "Attribute", was immer das ist. Da gibt es dann keine entsprechenden Unterverzeichnisse sondern nur entsprechende *.py-Dateien. Da muss ich dann mit help das einzelne Modul aufrufen. Problem ist nur, wenn ich z.B. etwas über das Objekt LED erfahren will, muss ich wissen, das es zu dem Attribut output_devices gehört. Alles sehr kompliziert. Vielleicht versuche ich es mal mit der Darstellung über Browser. Für Inhalt der Standardlibrary gibt es immerhin die Originaldoku auf python.org


    Noch ne blöde Frage: Mit time.sleep() importiere ich eine Funktion, die ich so verwenden kann. Mit LED importiere ich anscheinend eine Objektklasse, und verwende deren Methode, ich kann also nicht LED.on importieren. Wenn man nicht in der Doku nachschaut kann man das aber wohl nicht sehen!??? Man sollte es aber sehen, da das Objekt anscheinend (hier mit red=LED(..)) instanziiert werden muss.

    Gruss, wonk :danke_ATDE:

    Edited 2 times, last by wonk ().

  • wonk: Stimmt `RPi` hat ein einziges Package. Das Unterverzeichnis `GPIO` alleine reicht da noch nicht, da muss auch eine `__init__.py` drin liegen, sowohlin `RPi` als auch in `GPIO` denn *da* drin ist definiert was der Inhalt des Modul ist wenn man das Package als Modul importiert. Bei `RPi` ist diese Datei leer und bei `GPIO` stehen da die Definitionen für den Python-Teil von diesem Modul drin. Der Code dort importiert allerdings nur die in C geschriebenen Objekte aus dem `RPi._GPIO`-Modul.


    `gpiozero` hat auch ein Subpackage:`pins`. Ansonsten einen Haufen Untermodule aus denen so einiges in `gpiozero` importiert wird, damit man das in dem Namensraum findet und nicht aus den Untermodulen importieren muss.


    Attribute sind die Dinge die man per Punktoperator von einem Objekt abfragen kann. Also `object.attribute` fragt vom Objekt `object` das Attribut `attribute` ab. Konkretes Beispiel `gpiozero.Button` hat als Ergebnis das `Button`-Attribut von dem Objekt das an den Namen `gpiozero` gebunden ist.


    Da `gpiozero` alles mögliche aus den Untermodulen importiert, musst Du bei `LED` nicht wissen in welchem Modul das definiert ist, weil das als Attribut auf dem `gpiozero`-Objekt existiert:

    Python
    In [204]: gpiozero.LED                                                          
    Out[204]: gpiozero.output_devices.LED
    
    In [205]: help(gpiozero.LED)
    # ...
    # viel Text
    # ...

    Die Dokumentation zu `gpiozero` wurde ja bereits verlinkt. Du musst Dich da nicht in einer Python-Shell mit `help()` durchhangeln. Das ist eher praktisch wenn man mit Objekten in einer Python-Shell ”live” herum spielt. Und da dann beispielsweise auch für den umgekehrten Weg: um heraus zu finden wo das eigentlich definiert ist, um dort dann zum Beispiel mal in den Quelltext zu schauen. Sowohl die Python-Dokumentation als auch die von `gpiozero` bieten auch mehr als die API-Dokumentation der Objekte selbst. Einführungen, Tutorials, Allgemeineres.


    Das „Objekt“ bei „Objektklasse“ ist ein bisschen komisch. Das ist nur eine Klasse. Da noch das Wort Objekt vorne dran zu hängen ist irgendwie bedeutungslos, denn es gibt nur diese eine Art von Klassen.


    Man kann keine Methoden importieren, weil das nicht wirklich sinnvoll wäre. Was würdest Du denn damit anfangen wollen wenn Du `on()` von `LED` importieren könntest? Zum Aufrufen bräuchte man Objekt vom Typ `LED`, um das zu erstellen bräuchte man die Klasse `LED`. Die müsste man also sowieso importieren. Oder irgend etwas anderes was ein `LED`-Exemplar erzeugen könnte. Und selbst dann wäre es sehr ungewöhnlich die Funktion mit einem Objekt vom passenden Typ aufzurufen, statt die Methode auf diesem Objekt. Das bringt keinen Vorteil, aber den Nachteil, dass man dann selbst dafür verantwortlich ist, dass Funktion und erstes Argument zusammen passen und man verliert den Vorteil der Polymorphie bei diesem Aufruf.


    Das `LED` eine Klasse ist sieht man an der Namensschreibweise. Also fast, denn da es *komplett* in Grossbuchstaben geschrieben ist, könnte es auch eine Konstante sein (was Klassen in aller Regel *auch* sind). Bei `Button` ist es aber beispielsweise eindeutig.


    Ansonsten sagt einem `help()` auch dass es eine Klasse ist.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors

  • Hallo!

    Danke für die Ausführungen, auch wenn ich nicht alles verstehe. Das Library-Konzept von Python ist doch sehr komplex und für Anfänger schwer verdaulich. Ich habe auch den Eindruck, dass meine Fragen hier eher ungewöhnlich sind, warum auch immer.

    Gruss, wonk :danke_ATDE: