ProgrammierungBackend-Entwickler

Erzählen Sie, was beim Import eines Moduls in Python passiert. Wie sucht und lädt Python Module? Welche typischen Fehler können bei einer falschen Organisation des Imports auftreten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Wenn in Python ein Modul importiert wird, sucht der Interpreter es in den Verzeichnissen, die in sys.path aufgelistet sind. Zuerst wird unter den Standardmodulen gesucht, dann unter den .py, .pyc-Dateien und Verzeichnissen mit der __init__.py-Datei (Pakete).

  1. Wenn das Modul bereits importiert wurde, wird der erneute Import einfach aus sys.modules entnommen.
  2. Wenn das Modul in den Standardpfaden nicht gefunden wird, wird eine Ausnahme ModuleNotFoundError ausgelöst.
  3. Beim Importieren wird das Modul in Bytecode (.pyc) kompiliert und zwischengespeichert (wenn Schreibrechte vorhanden sind).

Beispiel:

# mypkg/__init__.py (kann leer sein) # mypkg/mod.py # main.py import mypkg.mod
  • Der Dateiname, die Verzeichnisstruktur, die Existenz/Nicht-Existenz von __init__.py (für Python <3.3 zwingend erforderlich) — all dies ist wichtig.

Wie es sucht:

  • Zuerst absoluter Import.
  • Dann wird in den Verzeichnissen sys.path gesucht (zuerst immer das Verzeichnis des aktuellen Skripts).
  • In Paketen ist der Kontext wichtig (from . import ..., absoluter/relativer Import).

Fangfrage.

Was passiert, wenn im Verzeichnis mit Ihrem Skript eine Datei mit dem Namen random.py liegt und Sie versuchen, das Standardmodul random zu importieren?

Antwort:

Es wird MEINE lokale Datei random.py importiert, nicht die Standardbibliothek. Eine häufige Ursache für schwer zu findende Bugs sind Namenskonflikte von Modulen mit Bibliotheken (Shadowing). Vorgänge mit der Benennung von Dateien sollten aufmerksam behandelt werden.

Beispiele für reale Fehler aufgrund unzureichenden Wissens über die Feinheiten des Themas.


Geschichte

In einem großen Projekt hat das Modul email.py zufällig das Standardmodul email aus der Bibliothek überschattet, und die Entwickler konnten lange Zeit nicht verstehen, warum die Funktionen zum Parsen von E-Mails aus Drittbibliotheken nicht funktionierten.


Geschichte

In einem ML-Projekt funktionierte die Funktion os.path nicht: Neben dem Hauptskript befand sich die Datei os.py, die alle Aufrufe des Standardmoduls abfing. Ein Monat wurde mit der Fehlersuche verbracht, bevor der Namenskonflikt gefunden wurde.


Geschichte

In einem mikroservicebasierten REST API traten zirkuläre Importe auf, als versucht wurde, relative Importe von Modellen zwischen mehreren Subpaketen zu machen. Das Problem wurde erst nach der Umstrukturierung des Projekts und einer expliziten Reihenfolge der Modul-Ladung gelöst.