Erleichtern Sie die Anzeige von Python-Modulausnahmen

Vor kurzem habe ich mich gefragt, wie ich die Anzeige von Modulausnahmen in Python verständlicher machen kann, aber ich habe die beste Methode gefunden und sie zusammengefasst. Lassen Sie uns zunächst die allgemeine Methode zum Definieren von Modulausnahmen überprüfen.

Allgemeine Methode

Betrachten wir als konkrete Situation die Situation beim Schreiben des urllib83-Moduls, das aus der Funktion urllib83.urlopen () in Python 3.3 besteht. urllib83 bedeutet das 83. urllib-Modul, aber es tut mir leid, wenn in Zukunft ein Standardmodul mit demselben Namen angezeigt wird.

Nehmen wir außerdem an, dass dieses Modul aus den folgenden drei Dateien besteht.

urllib83/__init__.py
         ftp.py
         http.py

Wenn Sie mit aller Kraft "urllib83.urlopen ()" schreiben, sollte es so aussehen.

__init__.py


from .ftp import ftpopen
from .http import httpopen


def urlopen(url):
    if url.startswith("ftp://"):
        return ftpopen(url)
    else:
        return httpopen(url)

Als nächstes nehmen wir an, dass dieses Modul die Ausnahmeklassen "urllib83.FTPError" und "urllib83.HTTPError" hat, die beide von der Basisausnahmeklasse "urllib83.Urllib83Error" erben. Wenn Sie diese drei Ausnahmeklassen gehorsam implementieren, wird in `urllib83 / __ init __. Py '

urllib83/__init__.py


class Urllib83Error(Exception):
    pass


class FTPError(Urllib83Error):
    pass


class HTTPError(Urllib83Error):
    pass

Ich denke, dass es definiert wird als, aber es gibt ein Problem mit dieser Methode. urllib83.FTPError wird natürlich in urllib83 / ftp.py ausgelöst, also wird ftp.py`` FTPError auslösen,

urllib83/ftp.py


from . import FTPError

def ftpopen(url):
    ...
    raise FTPError

Es wird beim Importieren von like verwendet, aber wie oben erwähnt, importiert __init __. Py`` ftpopen () from ftp.py. Bei dieser Rate importieren sich "__init __. Py" und "ftp.py" gegenseitig, was das Problem des zirkulären Imports verursacht.

Um dieses Problem zu vermeiden, fügen Sie im Allgemeinen eine Datei mit dem Namen "urllib83 / Errors.py" hinzu und erstellen Sie sie wie folgt.

urllib83/errors.py


class Urllib83Error(Exception):
    pass

class FTPError(Urllib83Error):
    pass

class HTTPError(Urllib83Error):
    pass

Jede andere Datei als error.py

__init__.py


from .errors import Urllib83Error, FTPError, HTTPError

__all__ = ['Urllib83Error', 'FTPError', 'HTTPError']

Importieren Sie die erforderliche Ausnahmeklasse wie in. (Hinweis:__all__Benötigt die Leitung__init__.pynur. )

__init__.pyImportiert auch die Ausnahmeklasse, also auch die Seite, die das urllib83-Modul verwendet

client.py


from urllib83 import urlopen, Urllib83Error

try:
    urlopen(url)
except Urllib83Error:
    pass

Sie können solche Modulausnahmen verwenden. Daran ist nichts auszusetzen.

##Was ist los?## Was mich interessierte war, dass die Seite, die das urllib83-Modul verwendet, es versuchte...Ohne die Ausnahme-Anweisung zu verwendenurllib83.urlopen() Wenn du anrufst. urllib83.FTPErrorWenn dies auftritt, wird der Traceback wie unten gezeigt angezeigt.

python


>>> import urllib83
>>> urllib83.urlopen("ftp://")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./urllib83/__init__.py", line 10, in urlopen
    return ftpopen(url)
  File "./urllib83/ftp.py", line 4, in ftpopen
    raise FTPError
urllib83.errors.FTPError
>>>

In der letzten Zeileurllib83.FTPErrornicht,urllib83.errors.FTPErrorWird angezeigt. Das ist ein Problem,urllib83.FTPErrorIch bin der Meinung, dass es angezeigt werden sollte.

Die allgemeine Ansicht der Pythonista-Leute lautet jedoch: "Ich habe keine Ahnung, wo das Problem in dieser Anzeige liegt." Der Grund ist

Die Dokumentation zum Modul urllib83urllib83.FTPErrorWird auftreten, und der Benutzer wird in der Ausnahmeklausel sagen,except urllib83.FTPError:Sie können die aufgetretene Ausnahme schriftlich ergänzen. Das Problem besteht nirgendwo, da es gemäß den in der Dokumentation beschriebenen Spezifikationen funktioniert

ist das, was sie sagten. Andererseits ist mein Gegenargument dazu

Benutzer des urllib83-Modulsurllib83.errors.FTPErrorWurde in der Dokumentation des urllib83-Moduls erwähnt, als ich tatsächlich auf die Indikation stießurllib83.FTPErrorIst es nicht zu teuer, das zu wissen? Von Anfang an,urllib83.FTPErrorIst einfacher zu verstehen und benutzerfreundlich, daher sollten Sie etwas dagegen tun.

Das ist.

##Lösungen## urllib83.FTPErrorIch habe verschiedene Möglichkeiten ausprobiert, um es anzuzeigen, aber am Endeerrors.pyAusnahmeklasse mit

errors.py


_SAVED_NAME = __name__
__name__ = __package__
# __name__ = "urllib83" # Klicken Sie hier für Python 3.2


class Urllib83Error(Exception):
    pass


class FTPError(Urllib83Error):
    pass


class HTTPError(Urllib83Error):
    pass

__name__ = _SAVED_NAME

Ich bin zu dem Schluss gekommen, dass es am besten ist, es als zu definieren.

Der Punkt ist__name__Schreiben Sie den Inhalt des Attributs vorübergehend neu und stellen Sie ihn wieder her, wenn die Ausnahmeklasse definiert wurde. Wenn eine Ausnahme auftritt, wird Folgendes angezeigt.

python


>>> import urllib83
>>> urllib83.urlopen("ftp://")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./urllib83/__init__.py", line 10, in urlopen
    return ftpopen(url)
  File "./urllib83/ftp.py", line 4, in ftpopen
    raise FTPError
urllib83.FTPError
>>>

Richtigurllib83.FTPErrorWird angezeigt.

__name__Das Umschreiben von Attributen ist nicht üblich. Wenn Sie komplexen Code schreiben,urllib83/__init__.pyEs kann einen Unterschied zu der Definition in geben__name__Wir empfehlen dringend, dass Sie beim Umschreiben von Attributen eine komplizierte Verarbeitung so weit wie möglich vermeiden. dann,__name__Vergessen Sie nicht, die Attribute rückgängig zu machen.

##Schließlich## Bisher haben wir keine Probleme mit dieser Methode gefunden. Wenn Sie jedoch Probleme bemerken, teilen Sie uns dies bitte in den Kommentaren mit. Stimmt etwas mit der integrierten Entwicklungsumgebung nicht? Darüber mache ich mir besonders Sorgen.

Recommended Posts

Erleichtern Sie die Anzeige von Python-Modulausnahmen
14 Tests, um den überraschend verwirrenden Umfang von Python zu verstehen
Färben Sie Python-Fehler (Stapelspuren), um sie verständlicher zu machen
26.11.2015 Python> Funktionsliste des Moduls anzeigen> Mathematik importieren> Verzeichnis (Mathematik)
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Tipps, um das Lesen von Python-Hördokumenten zu vereinfachen
[Python] So zeigen Sie Zufallszahlen an (Zufallsmodul)
[Python3] Verstehe die Grundlagen von Beautiful Soup
Übergeben Sie den Pfad des importierten Python-Moduls
Erstellen Sie ein Beziehungsdiagramm von Python-Modulen
Überprüfen Sie den Pfad des importierten Python-Moduls
[Python3] Grundlegendes zu Dateivorgängen
[Python] So ändern Sie das Datumsformat (Anzeigeformat)
Kopieren Sie die Liste in Python
[Python] Ein grobes Verständnis des Protokollierungsmoduls
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Wissensnotizen erforderlich, um das Python-Framework zu verstehen
Ich möchte den Fortschritt in Python anzeigen!
der Zen von Python
Einfache Möglichkeit, die Quelle der Python-Module zu überprüfen
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
So ermitteln Sie die Anzahl der Stellen in Python
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
Verwendung von Raspeye Relay Module Python
[Python] Ruft die Liste der im Modul definierten Klassen ab
Option [Python] zum Deaktivieren der Ausgabe von click.progressbar
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Verwenden wir die Python-Version des Confluence-API-Moduls.
Schreiben Sie Daten mit dem Python-Anforderungsmodul in KINTONE
[Python] Zusammenfassung, wie die Farbe der Figur angegeben wird
So greifen Sie auf die globale Variable des importierten Moduls zu
Verstehen Sie den Status des Datenverlusts - Python vs. R.
[Einführung in Python] Grundlegende Verwendung der Bibliothek matplotlib
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Die Website von "The Hitchhiker's Guide to Python" wurde vollständig übersetzt.
Python Open CV hat versucht, das Bild im Text anzuzeigen.
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
Stellen Sie die Verwaltungsseite für die Produktion bereit, um die Wartung zu vereinfachen.
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden 7 Erstellen eines Moduls
Der Hintergrund der Zeichen im Textbild ist überbelichtet, um das Lesen zu erleichtern.
Ein Hinweis auf Missverständnisse beim Versuch, das gesamte selbst erstellte Modul mit Python3 zu laden
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Python] Ändern Sie die Cache-Steuerung von Objekten, die in den Cloud-Speicher hochgeladen wurden
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Auf dem Weg zum Ruhestand von Python2
Versuchen Sie, Python selbst zu verstehen
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Mindestkenntnisse, um mit dem Python-Protokollierungsmodul zu beginnen
Über das Python-Modul venv
Sie, die das Protokoll ausmalen, um es besser sehen zu können
Die Geschichte der Einführung von Jedi (automatisches Vervollständigungspaket von Python) in Emacs
Automatisches Update des Python-Moduls
Anzeigen mit dem Python-Modul des mobilen Nifty Cloud-Backends
[Super einfach! ] So zeigen Sie den Inhalt von Wörterbüchern und Listen einschließlich Japanisch in Python an