Motivation
Motiviert durch dieses Problem - das OP verwendete urlopen()
und übergab versehentlich eine sys.argv
-Liste anstelle von a Zeichenfolge als url
. Diese Fehlermeldung wurde ausgelöst:
AttributeError: Das Objekt 'list' hat kein Attribut 'timeout'
Wegen der Art und Weise, wie urlopen
geschrieben wurde, ist die Fehlermeldung selbst und das Traceback nicht sehr informativ und möglicherweise besonders für einen Python-Neuling schwer zu verstehen:
Problem
Hier ist der verkürzte Code, mit dem ich arbeite:
%Vor% Ich versuche darüber nachzudenken, ob diese Art von Fehlern statisch erkannt werden kann, entweder mit intelligenten IDEs wie PyCharm, statischen Codeanalyse-Tools wie flake8
oder pylint
oder mit Sprachfunktionen wie Typ Anmerkungen .
Aber ich kann das Problem nicht erkennen:
flake8
und pylint
zu fangen - sie warnen nicht vor dem Problem PyCharm
warnt nicht, dass sys.argv
in urlopen
übergeben wird, obwohl, wenn Sie "zur Quelle springen" von sys.argv
wie folgt definiert ist:
wenn ich den Funktionsparameter als Zeichenfolge annotiere und sys.argv
übergebe, auch keine Warnungen:
Frage
Ist es möglich, dieses Problem statisch zu erfassen (ohne den Code tatsächlich auszuführen)?
Anstatt es für den Editor spezifisch zu halten, können Sie mypy verwenden, um Ihren Code zu analysieren. Auf diese Weise wird es in allen Entwicklungsumgebungen ausgeführt und nicht nur für diejenigen, die PyCharm verwenden.
%Vor%Die von mypy angegebenen Punkte für den obigen Code:
%Vor% Mypy kann den Typ von sys.argv
aufgrund seiner Definition in seiner Stub-Datei erraten. Momentan sind einige Standard-Bibliotheksmodule immer noch nicht in typeshed
vorhanden, also müssen Sie sie entweder beisteuern oder ignoriere die Fehler, bis sie hinzugefügt werden: -).
Um solche Fehler zu erfassen, können Sie mypy auf den Dateien mit Anmerkungen mit Ihren Tests in Ihrem CI-Tool ausführen. Das Ausführen für alle Dateien im Projekt kann einige Zeit dauern, für ein kleines Projekt ist es Ihre Wahl.
Fügen Sie einen Pre-Commit-Hook hinzu, der mypy auf gestaffelte Dateien ausführt und auf Probleme sofort hinweist (das könnte für den Entwickler ein wenig nervig sein, wenn es eine Weile dauert).
Zuerst müssen Sie überprüfen, ob der URL-Typ String ist oder nicht, und wenn String dann nach ValueError-Ausnahme (gültige URL) suchen
%Vor%Tags und Links python static-analysis pycharm type-hinting urlopen