Ich habe ein Python-Modul auf meinem System installiert und möchte sehen können, welche Funktionen / Klassen / Methoden darin verfügbar sind.
Ich möchte die doc-Funktion für jeden einzelnen aufrufen. In Ruby kann ich so etwas wie ClassName.methods ausführen, um eine Liste aller in dieser Klasse verfügbaren Methoden abzurufen. Gibt es etwas Ähnliches in Python?
z.B. etwas wie:
from somemodule import foo
print foo.methods # or whatever is the correct method to call
python
reflection
module
inspect
Chris Gow
quelle
quelle
Antworten:
Das
inspect
Modul. Siehe auch daspydoc
Modul, diehelp()
Funktion im interaktiven Interpreter und daspydoc
Befehlszeilentool, das die Dokumentation generiert, nach der Sie suchen. Sie können ihnen einfach die Klasse geben, deren Dokumentation Sie sehen möchten. Sie können beispielsweise auch HTML-Ausgaben generieren und auf die Festplatte schreiben.quelle
ast
in meiner Antwort dafür plädiert, das Modul in bestimmten Situationen zu verwenden .dir
diese Option, um Funktionen und Variablen zurückzugeben. verwendeninspect
nur Filterfunktionen; und verwenden, umast
zu analysieren, ohne zu importieren.Mit können
dir(module)
Sie alle verfügbaren Methoden / Attribute anzeigen. Schauen Sie sich auch PyDocs an.quelle
dir()
Funktion "versucht, die relevantesten und nicht die vollständigsten Informationen zu erzeugen". Quelle: docs.python.org/library/functions.html#dir .inspect
.Sobald Sie
import
das Modul bearbeitet haben, können Sie einfach Folgendes tun:... um die Dokumente interaktiv auf alle Funktionen gleichzeitig abzurufen. Oder Sie können verwenden:
... um einfach die Namen aller im Modul definierten Funktionen und Variablen aufzulisten.
quelle
inspect
Modul kann auch Listenvariablen, obwohl hier nicht explizit angefordert. Diese Lösung erfordert nur integrierte Objekte. Dies kann in einigen Fällen sehr nützlich sein, in denen Python in einer eingeschränkten / gesperrten / defekten Umgebung installiert ist.dir
würde die Ergebnisse drucken, aber es sieht so aus, als müssten Sie es tunprint(dir(modulename))
.Ein Beispiel mit inspect:
getmembers gibt eine Liste von (Objektname, Objekttyp) Tupeln zurück.
Sie können die Funktion durch eine der anderen isXXX-Funktionen im Inspektionsmodul ersetzen.
quelle
getmembers
kann ein Prädikat nehmen, so dass Ihr Beispiel auch geschrieben werden könnte:functions_list = [o for o in getmembers(my_module, isfunction)]
functions_list = getmembers(my_module, predicate)
weil es bereits eine Liste zurückgibt;)quelle
Der Vollständigkeit halber möchte ich darauf hinweisen, dass Sie manchmal Code analysieren möchten, anstatt ihn zu importieren. Ein
import
wird ausgeführt Top-Level - Ausdrücke, und das könnte ein Problem sein.Ich lasse Benutzer beispielsweise Einstiegspunktfunktionen für Pakete auswählen, die mit zipapp erstellt werden . Verwenden von
import
undinspect
riskieren, dass fehlerhafter Code ausgeführt wird, was zu Abstürzen, Ausdrucken von Hilfemeldungen, Auftauchen von GUI-Dialogen usw. führt.Stattdessen verwende ich das ast- Modul, um alle Funktionen der obersten Ebene aufzulisten:
Wenn
list.py
ich diesen Code eingebe und mich selbst als Eingabe verwende, erhalte ich:Natürlich kann das Navigieren in einem AST manchmal schwierig sein, selbst für eine relativ einfache Sprache wie Python, da der AST ziemlich niedrig ist. Wenn Sie jedoch einen einfachen und klaren Anwendungsfall haben, ist dieser sowohl machbar als auch sicher.
Ein Nachteil ist jedoch, dass Sie keine Funktionen erkennen können, die zur Laufzeit generiert werden, wie z
foo = lambda x,y: x*y
.quelle
__version__
etc). Gibt es einen Weg, das zu bekommen?Für Code, den Sie nicht analysieren möchten, empfehle ich den AST-basierten Ansatz von @csl oben.
Für alles andere ist das Inspektionsmodul korrekt:
Dies gibt eine Liste von 2 Tupeln im Formular
[(<name:str>, <value:function>), ...]
.Die obige einfache Antwort wird in verschiedenen Antworten und Kommentaren angedeutet, aber nicht explizit erwähnt.
quelle
Dies wird den Trick machen:
Wenn Sie es jedoch ärgerlich finden, die zurückgegebene Liste zu lesen, verwenden Sie einfach die folgende Schleife, um einen Namen pro Zeile zu erhalten.
quelle
inspect
. Außerdem, wie unterscheidet sich das von @ DanLenskis Antwort?dir(module)
ist die Standardmethode bei der Verwendung eines Skripts oder des Standardinterpreters, wie in den meisten Antworten erwähnt.Mit einer interaktiven Python-Shell wie IPython können Sie jedoch mithilfe der Tab-Vervollständigung einen Überblick über alle im Modul definierten Objekte erhalten. Dies ist viel praktischer, als ein Skript zu verwenden und
print
zu sehen, was im Modul definiert ist.module.<tab>
zeigt Ihnen alle im Modul definierten Objekte (Funktionen, Klassen usw.)module.ClassX.<tab>
zeigt Ihnen die Methoden und Attribute einer Klassemodule.function_xy?
odermodule.ClassX.method_xy?
zeigt Ihnen die Dokumentzeichenfolge dieser Funktion / Methodemodule.function_x??
odermodule.SomeClass.method_xy??
zeigt Ihnen den Quellcode der Funktion / Methode.quelle
Für globale Funktionen
dir()
ist der zu verwendende Befehl (wie in den meisten dieser Antworten erwähnt), der jedoch sowohl öffentliche als auch nicht öffentliche Funktionen zusammen auflistet.Zum Beispiel laufen:
Gibt Funktionen / Klassen zurück wie:
Einige davon sind im Allgemeinen nicht für die allgemeine Programmierung Gebrauch gedacht (aber durch das Modul selbst, außer im Fall von DunderAliases wie
__doc__
,__file__
ect). Aus diesem Grund ist es möglicherweise nicht sinnvoll, sie mit den öffentlichen aufzulisten (so weiß Python, was bei der Verwendung zu bekommen istfrom module import *
).__all__
könnte verwendet werden, um dieses Problem zu lösen. Es gibt eine Liste aller öffentlichen Funktionen und Klassen in einem Modul zurück (diejenigen, die nicht mit Unterstrichen beginnen -_
). Siehe Kann jemand __all__ in Python erklären? für die Verwendung von__all__
.Hier ist ein Beispiel:
Alle Funktionen und Klassen mit Unterstrichen wurden entfernt, sodass nur diejenigen übrig bleiben, die als öffentlich definiert sind und daher über verwendet werden können
import *
.Beachten Sie, dass dies
__all__
nicht immer definiert ist. Wenn es nicht enthalten ist, dann einAttributeError
ausgelöst.Ein Fall hierfür ist das ast-Modul:
quelle
Keine dieser Antworten funktioniert, wenn Sie diese Python-Datei nicht ohne Importfehler importieren können. Dies war bei mir der Fall, als ich eine Datei inspizierte, die aus einer großen Codebasis mit vielen Abhängigkeiten stammt. Im Folgenden wird die Datei als Text verarbeitet und nach allen Methodennamen gesucht, die mit "def" beginnen, und sie und ihre Zeilennummern gedruckt.
quelle
ast
Modul zu verwenden. Siehe meine Antwort für ein Beispiel.Mit Ausnahme von dir (Modul) oder help (Modul), die in den vorherigen Antworten erwähnt wurden, können Sie auch
Folgendes versuchen: - Öffnen Sie ipython
- importieren Sie den Modulnamen
- geben Sie den Modulnamen ein und drücken Sie die Tabulatortaste. Es öffnet sich ein kleines Fenster mit einer Auflistung aller Funktionen im Python-Modul.
Es sieht sehr ordentlich aus.
Hier ist ein Ausschnitt, der alle Funktionen des Hashlib-Moduls auflistet
quelle
Dadurch werden alle in your_module definierten Funktionen in einer Liste angehängt.
quelle
unit8_conversion_methods
? Ist dies nur ein Beispiel für den Modulnamen?[getattr(your_module, func) for func in dir(your_module) if type(getattr(your_module, func)).__name__ == "function"]
Mit der folgenden Methode können Sie alle Funktionen in Ihrem Modul aus der Shell auflisten:
import module
quelle
quelle
Ausgabe :
quelle