Wie alle im Skript verwendeten Variablen- und Methodennamen abgerufen werden

8

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.

    
farhawa 05.11.2015, 20:20
quelle

4 Antworten

13

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):

%Vor%

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:

%Vor%

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 ):

%Vor%

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:

%Vor%

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.

    
ShadowRanger 05.11.2015, 20:32
quelle
2

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:

%Vor%

Beachten Sie jedoch, dass die lokalen Namen in der Funktion nicht wie something angezeigt werden. Zu diesem Zweck können Sie inspect module Ссылка

sehen     
Kasramvd 05.11.2015 20:30
quelle
2

Es gibt eine Menge von Variablen, die von Python importiert werden, so dass Sie eine lange Liste bekommen, aber vars() funktioniert.

%Vor%

im Terminal:

%Vor%

BEARBEITEN
Sie können es ein bisschen aufräumen, indem Sie nach dem Typ der Variablen suchen

%Vor%

im Terminal:

%Vor%     
Ben 05.11.2015 20:31
quelle
1

Sie können dafür dir () verwenden. Angenommen, Sie speichern Ihre Datei als test.py. Sie können Folgendes tun:

%Vor%     
Prayag 05.11.2015 20:30
quelle

Tags und Links