Es kann komisch sein, aber ich suche nach einer Möglichkeit, alle Variablen und Methoden innerhalb eines Python-Skripts automatisch zu bekommen.
Zum Beispiel
%Vor%Ich möchte
bekommen %Vor%Dies ist ein demonstratives Beispiel, ich möchte dies für ein viel größeres Skript tun.
Das Modul ast
kann dies relativ einfach tun. Wenn wir annehmen, dass die Quelle in einer Variablen namens source
gespeichert ist (könnte aus einer Datei gelesen werden):
Das verliert die Ordnung, um die Einheitlichkeit und die freundliche Reihenfolge der Anzeigen zu erreichen, aber Sie könnten einfach ein Listenverständnis oder einen Generatorausdruck anstelle eines Satzverstehens verwenden, wenn Sie keine Eindeutigkeit benötigen, sondern eine Reihenfolge wünschen. Das resultierende list
ist:
Im Gegensatz zu den anderen bislang veröffentlichten Lösungen wird dies in Klassen und Funktionen rekurriert, um die darin verwendeten Namen abzurufen. Sie müssen weder das zu prüfende Modul oder die zu importierende Klasse noch rekursive Verarbeitung implementieren dich selber; Jeder syntaktisch gültige Python-Code funktioniert.
Seltsamerweise erhalten Sie in Python 3 (durch Ersetzen eines gültigen Funktionsaufrufs print
):
fügt print
hinzu (wie erwartet; es ist jetzt ein Name, keine Keyword-Anweisung), aber x
wird weggelassen. Sie haben nicht nach x
gefragt (das Argument wurde von someMethod
erhalten), und das erzeugt es nicht in Python 3. Namen in Funktionsprototypen scheinen dort keinen ast.Name
Knoten zu erzeugen, go figure. Sie können diese Informationen aus dem ast.FunctionDef
-Knoten aus dem arg
-Attribut jedes Eintrags in list
node.args.args
ziehen, aber es ist wahrscheinlich immer noch nicht vollständig; Ich vermute, dass andere Namen, die mit der Definition zusammenhängen, übersehen werden könnten, z. in Klassendeklarationen mit Vererbung. Sie müssen mit einigen Beispielen herumstochern, um sicherzustellen, dass Sie alles überprüfen (vorausgesetzt, Sie möchten Sachen wie x
und möchten an Python 3 arbeiten).
Das heißt, x
würde sich gut zeigen, wenn Sie darauf verweisen würden; Wenn Sie es an do_something
übergeben oder es in irgendeiner Weise verwendet haben, außer es zu empfangen und zu verwerfen, wird es angezeigt.
Sie können sich auch bemühen, nur Namen zu behandeln, die nicht verwendet werden (zum Ausschließen von do_something
, range
), indem Sie den Test auf Folgendes erweitern:
Aber das wird auch someMethod
(sowohl in Py2 als auch in Py3) fallen lassen, weil die Definition selbst kein ast.Name
erzeugt, nur die Verwendung von it. Also noch einmal, Sie müssten etwas tiefer in die ast.Node
Interna für ast.FunctionDef
, ast.ClassDef
usw. eintauchen, um die Namen, die nicht walk
-ed sind, direkt zu bekommen.
Sie können globals()
function verwenden, um alle globalen Namen in Ihrem Modul abzurufen, und da python standardmäßig einige globale Namen wie __builtins__
hat, können Sie sie umgehen:
Da globals()
return ein Dictionary die Namen und die Werte enthält und Build-Namen ein Format wie __builtins__
haben, können Sie sie filtern:
Beachten Sie jedoch, dass die lokalen Namen in der Funktion nicht wie something
angezeigt werden. Zu diesem Zweck können Sie inspect
module Ссылка
Es gibt eine Menge von Variablen, die von Python importiert werden, so dass Sie eine lange Liste bekommen, aber vars()
funktioniert.
im Terminal:
%Vor% BEARBEITEN
Sie können es ein bisschen aufräumen, indem Sie nach dem Typ der Variablen suchen
im Terminal:
%Vor%