Frage

Ich habe einen Python-Modul auf meinem System installiert und ich möchte in der Lage sein zu sehen, welche Funktionen / Klassen / Methoden in ihm zur Verfügung stehen.

Ich möchte auf jedem der doc-Funktion aufzurufen. In Ruby kann ich so etwas wie ClassName.methods tun, um eine Liste aller Methoden dieser Klasse zur Verfügung zu bekommen. Gibt es etwas Ähnliches in Python?

zB. so etwas wie:

from somemodule import foo
print foo.methods # or whatever is the correct method to call
War es hilfreich?

Lösung

Die inspect Modul. Siehe auch der pydoc Modul, die help() Funktion im interaktiven Interpreter und die pydoc Kommandozeilen-Tool, das die Dokumentation, die Sie nach sind erzeugt. Sie können sie nur geben Sie die Klasse, die Sie wünschen, die Dokumentation zu sehen. Sie können auch erzeugen, zum Beispiel HTML-Ausgabe und schreiben Sie es auf der Festplatte.

Andere Tipps

Sie können dir(module) alle zur Verfügung stehenden Methoden / Attribute zu sehen. Überprüfen Sie auch PyDocs.

Wenn Sie das Modul imported haben, können Sie einfach tun:

 help(modulename)

... Um die Dokumentationen zu allen Funktionen auf einmal zu bekommen, interaktiv. Oder Sie verwenden können:

 dir(modulename)

... Um nur Liste die Namen aller Funktionen und Variablen im Modul definiert ist.

Ein Beispiel mit inspizieren:

from inspect import getmembers, isfunction
from my_project import my_module

functions_list = [o for o in getmembers(my_module) if isfunction(o[1])]

GetMembers gibt eine Liste von (object_name, object_type) Tupel.

Sie können isfunction mit einem der anderen isXXX Funktionen im inspizieren Modul ersetzen.

import types
import yourmodule

print([getattr(yourmodule, a) for a in dir(yourmodule)
  if isinstance(getattr(yourmodule, a), types.FunctionType)])

Der Vollständigkeit halber, würde Ich mag darauf hinweisen, dass manchmal können Sie auf Parse Code, anstatt sie zu importieren. Ein import wird Ausführen Top-Level-Ausdrücke, und das könnte ein Problem sein.

Zum Beispiel, ich lasse Benutzer Einstiegspunkt-Funktionen für Pakete auswählen wird, die mit zipapp . Mit import und inspect Risiken Irre Code ausgeführt wird, was zu Abstürzen, Hilfemeldungen ausgedruckt wird, GUI-Dialoge Aufspringen und so weiter.

Stattdessen verwende ich die ast Modul alle aufzulisten Top-Level-Funktionen:

import ast
import sys

def top_level_functions(body):
    return (f for f in body if isinstance(f, ast.FunctionDef))

def parse_ast(filename):
    with open(filename, "rt") as file:
        return ast.parse(file.read(), filename=filename)

if __name__ == "__main__":
    for filename in sys.argv[1:]:
        print(filename)
        tree = parse_ast(filename)
        for func in top_level_functions(tree.body):
            print("  %s" % func.name)

Setzen Sie diesen Code in list.py und mit sich selbst als Eingabe, die ich erhalten:

$ python list.py list.py
list.py
  top_level_functions
  parse_ast

Natürlich kann einen AST Navigation manchmal schwierig sein, selbst für eine relativ einfache Sprache wie Python, weil der AST ziemlich Low-Level ist. Aber wenn man einen einfachen und klaren Anwendungsfall hat, ist es sowohl machbar und sicher.

Obwohl, ein Nachteil ist, dass Sie keine Funktionen erkennen können, die zur Laufzeit erzeugt werden, wie foo = lambda x,y: x*y.

Dies wird den Trick tun:

dir(module) 

Wenn Sie jedoch es ärgerlich lesen Sie die zurückgegebene Liste zu finden, verwenden Sie einfach die folgende Schleife einen Namen pro Zeile zu erhalten.

for i in dir(module): print i

dir(module) ist der normale Weg, wenn ein Skript oder die Standard-Interpreter, wie in den meisten Antworten erwähnt.

Allerdings mit einer interaktiven Python-Shell wie IPython Tab-Vervollständigung verwenden können, eine Übersicht über alle Objekte im Modul zu erhalten. Das ist viel bequemer, als mit einem Skript und print zu sehen, was in dem Modul definiert ist.

  • module.<tab> zeigt Ihnen alle Objekte im Modul (Funktionen, Klassen usw.) definiert
  • module.ClassX.<tab> zeigen Ihnen die Methoden und Attribute einer Klasse
  • module.function_xy? oder module.ClassX.method_xy? zeigen Ihnen die docstring dieser Funktion / Methode
  • module.function_x?? oder module.SomeClass.method_xy?? zeigen Ihnen den Quellcode der Funktion / Methode.

Für Code, den Sie nicht wollen, zu analysieren, empfehle ich den AST-basierten Ansatz von @csl oben.

Für alles andere, das überprüfen Modul korrekt ist:

import inspect

import <module_to_inspect> as module

functions = inspect.getmembers(module, inspect.isfunction)

Dies ergibt eine Liste von 2-Tupeln in Form [(<name:str>, <value:function>), ...].

Die einfache Antwort oben auf in verschiedenen Antworten und Kommentaren angedeutet, aber nicht explizit genannt werden.

Für globale Funktionen dir() ist der Befehl zu verwenden (wie in den meisten diese Antworten erwähnt), jedoch führt dies sowohl öffentliche Funktionen und nicht-öffentliche Funktionen zusammen.

Zum Beispiel läuft:

>>> import re
>>> dir(re)

Gibt Funktionen / Klassen wie:

'__all__', '_MAXCACHE', '_alphanum_bytes', '_alphanum_str', '_pattern_type', '_pickle', '_subx'

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 kann es nicht sinnvoll sein, sie mit den öffentlichen diejenigen aufzulisten (dies ist, wie Python weiß, was zu bekommen, wenn mit from module import *).

__all__ verwendet werden könnte, um dieses Problem zu lösen, es gibt eine Liste aller öffentlichen Funktionen und Klassen in einem Modul (jene, die nicht beginnt mit Unterstrichen - _). Sehen Kann jemand erklären __all__ in Python? für die Verwendung von __all__.

Hier ist ein Beispiel:

>>> import re
>>> re.__all__
['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
>>>

Alle Funktionen und Klassen mit Unterstrichen entfernt wurden, nur diejenigen verlassen, die als öffentlich definiert und kann daher über import * verwendet werden.

Beachten Sie, dass __all__ nicht immer definiert. Wenn es nicht enthalten ist, dann wird ein AttributeError angehoben.

Ein Fall ist dies mit dem ast Modul:

>>> import ast
>>> ast.__all__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'ast' has no attribute '__all__'
>>>

Keine dieser Antworten wird funktionieren, wenn Sie importieren nicht in der Lage auf die Python-Datei ohne Importfehler. Dies war der Fall für mich, wenn ich eine Datei Inspektion, die mit einer Menge von Abhängigkeiten von einer großen Code-Basis kommt. Im Folgenden wird die Datei als Text verarbeiten und für alle Methodennamen sucht, die mit „def“ beginnen und sie und ihre Zeilennummern drucken.

import re
pattern = re.compile("def (.*)\(")
for i, line in enumerate(open('Example.py')):
  for match in re.finditer(pattern, line):
    print '%s: %s' % (i+1, match.groups()[0])

Außer mir (Modul) oder Hilfe (Modul) in früheren Antworten erwähnt, können Sie auch versuchen:
 - Öffnen Sie ipython
 - Import module_name
 - Typ module_name, die Tabulatortaste drücken. Es wird ein kleines Fenster öffnet mit allen Funktionen in dem Python-Modul auflistet.
Es sieht sehr ordentlich.

Hier Schnipsel listet alle Funktionen von hashlib Modul

(C:\Program Files\Anaconda2) C:\Users\lenovo>ipython
Python 2.7.12 |Anaconda 4.2.0 (64-bit)| (default, Jun 29 2016, 11:07:13) [MSC v.1500 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

IPython 5.1.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: import hashlib

In [2]: hashlib.
             hashlib.algorithms            hashlib.new                   hashlib.sha256
             hashlib.algorithms_available  hashlib.pbkdf2_hmac           hashlib.sha384
             hashlib.algorithms_guaranteed hashlib.sha1                  hashlib.sha512
             hashlib.md5                   hashlib.sha224

Sie können die folgende Methode verwenden, um alle Funktionen in Ihrem Modul von Shell zu erhalten Liste:

import module

module.*?

Damit werden alle Funktionen anfügen, die in your_module in einer Liste definiert sind.

result=[]
for i in dir(unit8_conversion_methods):
    if type(getattr(your_module, i)).__name__ == "function":
        result.append(getattr(your_module, i))

Es ist nicht (oder zumindest nicht mehr) proper dir (Modul) zu verwenden. Der Code sollte wie folgt lauten:

dir('module') or dir('modules') 

oder geben Sie das Modul Sie wie folgt aus: dir('sys') Ergebnisse aus den Modulnamen sys zu erzeugen. dir() gibt Fehler während dir('') ist das, was Sie brauchen. * Help ( ‚‘) werden Hilfeinformationen, wenn für die meisten Funktionen zurück. z.B; help('modules') wird Modul Hilfe Info zurück.

Vielen Dank für alle unten Stimmen. Ich war mit Python3.2.2 und andere 3x Versionen, als ich das geschrieben. Der Punkt war zu verwenden ( ‚Material‘) anstelle der bisherigen (Sachen). Aber ich nehme an, dass Ihr alle stecken auf Python2 oder neuer verwenden Versionen für PC nicht mobil, wie ich war.

http://effbot.org/librarybook/sys.htm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top