Übergeben einer Liste als URL-Wert an urlopen

8

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:

%Vor%

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:

  • es ist wahrscheinlich zu spezifisch für 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:

    %Vor%
  • wenn ich den Funktionsparameter als Zeichenfolge annotiere und sys.argv übergebe, auch keine Warnungen:

    %Vor%

Frage

Ist es möglich, dieses Problem statisch zu erfassen (ohne den Code tatsächlich auszuführen)?

    
alecxe 19.06.2017, 15:54
quelle

2 Antworten

5

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

Wann läuft mypy?

  1. 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.

  2. 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).

Ashwini Chaudhary 19.06.2017, 16:24
quelle
0

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%     
Supratim Samantray 28.06.2017 08:58
quelle