Normalerweise sehe ich dieses Muster mindestens einmal in jedem Python-Projekt, an dem ich arbeite. In einem Django-Projekt wird dies beispielsweise häufig am Ende der Basiseinstellungsdatei hinzugefügt:
try:
from .local_settings import *
except ImportError:
pass
Ebenfalls:
try:
import simplejson as json
except ImportError:
import json
Das hat mich aber immer ein bisschen gestört; Was ist, wenn das Modul erfolgreich importiert wurde, aber dann ein Selbst auslöst ImportError
? Im ersten Beispiel ist das local_settings
Modul beispielsweise vorhanden, local_settings
versucht dann jedoch , ein nicht vorhandenes Modul zu importieren.
Ist dies der sicherste Weg, ein optionales Modul zu importieren, gibt es einen besseren Weg, um diese Funktionalität zu erreichen, oder hängt es vom Kontext / der Verwendung ab (und wenn ja, welche Richtlinien gelten für die Entscheidung, wann dieser Ansatz verwendet werden soll)?
ImportWarning
.Dies ist im Allgemeinen sicher, vorausgesetzt, Ihre Module sind frei von Nebenwirkungen während des Imports.
Wenn ein importiertes Modul
ImportError
beim Import (nicht nur ) eine Ausnahme auslöst, wird es aus entferntsys.modules
. Das heißt, wenn ein anderer Code versucht, das Modul zu importieren, erhält er kein teilweise initialisiertes Modul. Stattdessen versucht Python, das Modul erneut zu laden, und schlägt vermutlich erneut fehlImportError
.Dies kann zu Problemen führen, wenn Ihre Module Nebenwirkungen beim Import haben, da diese Effekte nicht rückgängig gemacht werden. Insbesondere wenn das fehlerhafte Modul ein anderes Modul erfolgreich importiert, wird dieses nicht entfernt
sys.modules
. Diese besondere Nebenwirkung ist selten ein Problem, aber einige Nebenwirkungen können problematischer sein.quelle