In Python is een naamruimte (namespace) een woordenboek dat namen en objecten koppelt. De niveaus van naamruimten zijn: lokaal, globaal, en ingebouwd. Modules zijn aparte ruimtes voor het organiseren van code. Bij het importeren creëert Python een nieuwe naamruimte voor elke module.
import module — importeert de module en geeft toegang tot objecten via module.name.from module import name — importeert een object uit de module direct in de huidige ruimte (risico op naamconflicten).as — stelt je in staat een alias op te geven.Om naamconflicten te vermijden:
import mymodule), en geen sterretje (from... import *).__init__.py).import module as m).project/
package/
__init__.py
module1.py
module2.py
import package.module1 from package.module2 import function as fn
Vraag: Wat gebeurt er als een module twee keer wordt geïmporteerd? Wordt de hele code van de module opnieuw uitgevoerd?
Antwoord: Nee. Bij de eerste import wordt de module uitgevoerd en het resultaat wordt gecached in sys.modules. Een herhaalde import retourneert al het geladen module-object, de code wordt niet opnieuw uitgevoerd.
# module.py print('Hallo!') # main.py import module # zal Hallo! afdrukken import module # niets zal worden afgedrukt
Verhaal
from settings import * in verschillende modules, waardoor lokale variabelen onverwachts "overschreven" werden bij het wijzigen van instellingen, wat leidde tot moeilijk opspoorbare bugs.Verhaal
utils.py). Tijdens de integratiefase vervingen de modules met "dezelfde" naam elkaar, resulterend in onverwacht gedrag en complexe bugs.Verhaal
In een van de bibliotheken probeerden ze een module "warm opnieuw te importeren" met nieuwe instellingen via importlib.reload. Ze hielden er geen rekening mee dat al geïmporteerde andere modules de oude referenties naar objecten bewaarden, waardoor wijzigingen niet in alle delen van de applicatie werden toegepast.