ProgrammatieBackend ontwikkelaar

Vertel wat er gebeurt bij het importeren van een module in Python. Hoe zoekt en laadt Python modules? Welke typische fouten kunnen worden gemaakt bij een verkeerde organisatie van imports?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Wanneer er in Python een module wordt geïmporteerd, zoekt de interpreter deze in de directories die zijn vermeld in sys.path. Eerst zoekt hij tussen de standaardmodules, daarna tussen de bestanden .py, .pyc en directories met het bestand __init__.py (pakketten).

  1. Als de module al is geïmporteerd, haalt de tweede import deze gewoon uit sys.modules.
  2. Als de module niet wordt gevonden in de standaardpaden, wordt er een uitzondering ModuleNotFoundError opgegooid.
  3. Bij het importeren wordt de module omgezet in bytecode (.pyc) en gecached (indien schrijfrechten aanwezig zijn).

Voorbeeld:

# mypkg/__init__.py (kan leeg zijn) # mypkg/mod.py # main.py import mypkg.mod
  • De bestandsnaam, de structuur van de directories, de aanwezigheid/afwezigheid van __init__.py (voor Python <3.3 verplicht) — alles doet er toe.

Hoe zoekt:

  • Eerst absoluut import.
  • Daarna zoeken in de directories van sys.path (de directory van het huidige script gaat altijd als eerste).
  • In pakketten is de context belangrijk (from . import ..., absoluut/relatief import).

Vraag met een valkuil.

Wat gebeurt er als er een bestand met de naam random.py in de directory met uw script staat en u probeert de standaardmodule random te importeren?

Antwoord:

Er wordt MIJN lokale bestand random.py geïmporteerd en niet de standaardbibliotheek. Een veelvoorkomende oorzaak van moeilijk op te sporen bugs zijn naamconflicten van modules met bibliotheken (shadowing). Het is belangrijk om zorgvuldig om te gaan met bestandsnamen.

Voorbeelden van echte fouten door onwetendheid over de nuances van dit onderwerp.


Verhaal

In een groot project overschaduwde de module email.py per ongeluk de standaardmodule email uit de bibliotheek, en de ontwikkelaars konden lange tijd niet begrijpen waarom de e-mailparserfuncties uit externe bibliotheken niet werkten.


Verhaal

In een ML-project werkte de functie os.path niet: naast het hoofdscript was er een bestand os.py, dat alle aanroepen naar de standaardmodule onderschepte. Er werd een maand besteed aan debugging, voordat het naamconflict werd gevonden.


Verhaal

In een microservices REST API ontstonden circulaire imports bij het proberen een relatieve import van modellen tussen verschillende subpakketten te maken. Het probleem werd pas opgelost na het refactoren van de projectstructuur en een expliciete volgorde van module-lading.