Ich habe eine Codebase, in der ich einige unordentliche Entscheidungen des vorherigen Entwicklers beseitige. Häufig hat er so etwas wie gemacht:
%Vor%... Dies verschmutzt natürlich den Namensraum und macht es schwierig zu sagen, woher ein Attribut in dem Modul stammt.
Gibt es eine Möglichkeit, Python analysieren und für mich reparieren zu lassen? Hat jemand ein Dienstprogramm dafür gemacht? Wenn nicht, wie könnte ein solches Dienstprogramm erstellt werden?
Ich habe jetzt ein kleines Dienstprogramm dafür gemacht, das ich 'Dedazzler' nenne. Es werden Zeilen gefunden, die von 'Modulimport *' stammen, und dann das 'Verzeichnis' der Zielmodule erweitern und die Zeilen ersetzen.
Nach dem Ausführen müssen Sie noch einen Linter ausführen. Hier ist der besonders interessante Teil des Codes:
%Vor%Ich behalte dies in einem nützlicheren Stand-Alone-Utility-Formular hier:
Ich denke, dass die von Assisted Manual angebotenen Lösungen von PurityLake und Martijn Pieters wahrscheinlich der beste Weg sind. Aber es ist nicht unmöglich dies programmatisch zu tun.
Zunächst müssen Sie eine Liste aller im Wörterbuch des Moduls vorhandenen Namen abrufen, die im Code verwendet werden könnten. Ich gehe davon aus, dass Ihr Code keine dunder Funktionen usw. aufruft.
Dann müssen Sie sie durchlaufen, indem Sie inspect.getmodule()
verwenden, um herauszufinden, in welchem Modul jedes Objekt ursprünglich definiert wurde. Und ich gehe davon aus, dass Sie nichts verwenden, was doppelt from foo import *
-ed ist. Erstellen Sie eine Liste aller Namen, die in den Modulen numpy
und scipy
definiert wurden.
Jetzt können Sie diese Ausgabe nehmen und einfach jedes foo
durch numpy.foo
ersetzen.
Also, mach es zusammen, etwa so:
%Vor% Wenn eine der Annahmen falsch ist, ist es nicht schwer, den Code zu ändern. Vielleicht möchten Sie auch tempfile.NamedTemporaryFile
und andere Verbesserungen verwenden, um sicherzustellen, dass Sie nicht versehentlich Dinge mit temporären Dateien überschreiben. (Ich wollte einfach nicht mit den Kopfschmerzen des Schreibens von etwas plattformübergreifend umgehen; wenn Sie nicht unter Windows laufen, ist es einfach.) Und fügen Sie einige Fehlerbehandlung, offensichtlich, und wahrscheinlich einige Berichterstattung hinzu.
Ja. Entfernen Sie die Importe und führen Sie einen Linter auf dem Modul aus.
Ich empfehle die Verwendung von flake8
, obwohl es auch bei Stilfehlern sehr viel Rauschen erzeugen kann.
Das bloße Entfernen der Importe und das Ausführen des Codes wird wahrscheinlich nicht ausreichen, da viele Namensfehler erst dann auftreten, wenn Sie nur die richtige Codezeile mit der richtigen Eingabe ausführen. Ein Linter analysiert stattdessen den Code durch Parsing und erkennt das potenzielle NameError
s, ohne den Code ausführen zu müssen.
Dies alles setzt voraus, dass es keine zuverlässigen Komponententests gibt oder dass die Tests keine ausreichende Abdeckung bieten.
In diesem Fall, wo es multiple from module import *
-Zeilen gibt, wird es etwas schmerzhafter, da Sie für jeden fehlenden Namen herausfinden müssen, welches Modul diesen Namen geliefert hat. Das erfordert manuelle Arbeit, aber Sie können das Modul einfach in einen Python-Interpreter importieren und testen, ob der fehlende Name in diesem Modul definiert ist:
Sie müssen berücksichtigen, dass es in diesem speziellen Fall eine Überschneidung zwischen den Modulen numpy
und scipy
gibt; Für jeden in beiden Modulen definierten Namen gewinnt das zuletzt importierte Modul.
Beachten Sie, dass das Verlassen von any from module import *
-Zeile bedeutet, dass der linter nicht erkennen kann, welche Namen NameErrors auslösen könnten!
Ok, das ist, was ich denke, dass Sie tun könnten, brechen Sie das Programm. Entfernen Sie die Importe und beachten Sie die vorgenommenen Fehler. Dann importieren Sie nur die Module, die Sie wollen, dies kann eine Weile dauern, aber dies ist die einzige Art und Weise, wie ich das tue, ich wäre glücklich überrascht, wenn jemand von einem Werkzeug weiß, um zu helfen
BEARBEITEN: Ach ja, ein Alter, daran hatte ich nicht gedacht.
Tags und Links python namespaces python-import