Ich muss Routinen als veraltet markieren, aber anscheinend gibt es keinen Standard-Bibliotheksdekorateur für veraltet. Ich kenne die Rezepte dafür und das Warnmodul, aber meine Frage ist: Warum gibt es keinen Standard-Bibliotheksdekorateur für diese (allgemeine) Aufgabe?
Zusätzliche Frage: Gibt es überhaupt Standarddekorateure in der Standardbibliothek?
Antworten:
Hier ist ein Ausschnitt, der von den von Leandro zitierten geändert wurde:
Denn bei einigen Dolmetschern kann die erste exponierte Lösung (ohne Filterhandhabung) zu einer Warnunterdrückung führen.
quelle
functools.wraps
anstatt den Namen und das Dokument so festzulegen?Hier ist eine andere Lösung:
Mit diesem Dekorateur ( in der Tat eine Dekorateurfabrik ) können Sie eine Begründungsnachricht geben . Es ist auch nützlicher, dem Entwickler bei der Diagnose des Problems zu helfen, indem Sie die Quelle angeben Dateinamen und Zeilennummer .
BEARBEITEN : Dieser Code verwendet die Empfehlung von Zero: Er ersetzt die
warnings.warn_explicit
Zeile durchwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
, wodurch die Funktionsaufrufsite anstelle der Funktionsdefinitionssite gedruckt wird. Es erleichtert das Debuggen.EDIT2 : In dieser Version kann der Entwickler eine optionale "Grund" -Nachricht angeben.
Sie können diesen Dekorator für Funktionen verwenden , Methoden und Klassen verwenden .
Hier ist ein einfaches Beispiel:
Du wirst kriegen:
EDIT3: Dieser Dekorateur ist jetzt Teil der veralteten Bibliothek:
Neue stabile Version v1.2.10 🎉
quelle
warn_explicit
Zeile zu ersetzen , durchwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
die die Funktionsaufruf-Site gedruckt wird, anstatt die Funktionsdefinitions-Site. Es erleichtert das Debuggen.Wie von Myon vorgeschlagen , können Sie das
deprecation
Paket dafür installieren .Installation
Beispiel Verwendung
Die vollständige Dokumentation finden Sie unter http://deprecation.readthedocs.io/ .
quelle
Ich denke, der Grund dafür ist, dass Python-Code nicht statisch verarbeitet werden kann (wie dies bei C ++ - Compilern der Fall ist). Sie können keine Warnung über die Verwendung einiger Dinge erhalten, bevor Sie ihn tatsächlich verwenden. Ich denke nicht, dass es eine gute Idee ist, Benutzer Ihres Skripts mit einer Reihe von Meldungen zu spammen. "Warnung: Dieser Entwickler dieses Skripts verwendet eine veraltete API."
Update: Sie können jedoch einen Dekorator erstellen, der die ursprüngliche Funktion in eine andere umwandelt. Die neue Funktion markiert / prüft den Schalter und zeigt an, dass diese Funktion bereits aufgerufen wurde. Die Meldung wird nur angezeigt, wenn der Schalter in den Ein-Zustand versetzt wird. Und / oder beim Beenden wird möglicherweise eine Liste aller im Programm verwendeten veralteten Funktionen gedruckt.
quelle
Sie können eine Utils-Datei erstellen
Importieren Sie dann den Verfallsdekorateur wie folgt:
quelle
UPDATE: Ich denke, es ist besser, wenn wir DeprecationWarning nur zum ersten Mal für jede Codezeile anzeigen und wenn wir eine Nachricht senden können:
Ergebnis:
Wir können einfach auf den Warnpfad klicken und zur Zeile in PyCharm gehen.
quelle
Ergänzen Sie diese Antwort von Steven Vascellaro :
Wenn Sie Anaconda verwenden, installieren Sie zuerst das
deprecation
Paket:Fügen Sie dann Folgendes oben in die Datei ein
Die vollständige Dokumentation finden Sie unter http://deprecation.readthedocs.io/ .
quelle