In Python ist ein Namensraum (namespace) ein Wörterbuch, das Namen und Objekte verknüpft. Die Ebenen der Namensräume sind: lokal, global, eingebaut. Module sind separate Räume zur Organisation von Code. Beim Import erstellt Python einen neuen Namensraum für jedes Modul.
import module — importiert das Modul und ermöglicht den Zugriff auf Objekte über module.name.from module import name — importiert ein Objekt aus dem Modul direkt in den aktuellen Namensraum (Risiko von Namenskonflikten).as — erlaubt das Festlegen eines Alias.Um Namenskonflikte zu vermeiden:
import mymodule) anstelle von Sternchen (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
Frage: Was passiert, wenn ein Modul zweimal importiert wird? Wird der gesamte Code des Moduls erneut ausgeführt?
Antwort: Nein. Bei der ersten Importierung wird das Modul ausgeführt und das Ergebnis wird in sys.modules zwischengespeichert. Der erneute Import gibt bereits das geladene Modulobjekt zurück, der Code wird nicht erneut ausgeführt.
# module.py print('Hello!') # main.py import module # Gibt Hello! aus import module # Nichts wird ausgegeben
Geschichte
from settings import * in mehreren Modulen, was dazu führte, dass bei Änderungen der Einstellungen unerwartet lokale Variablen "überschrieben" wurden, was schwer zu findende Bugs verursachte.Geschichte
utils.py). Beim Integrationsschritt "überwahrten" sich Module mit "gleichen" Namen gegenseitig, was zu unerwartetem Verhalten und komplexen Bugs führte.Geschichte
In einer der Bibliotheken wurde versucht, ein Modul mit neuen Einstellungen über importlib.reload "heiß neu zu importieren". Dabei wurde nicht berücksichtigt, dass bereits importierte andere Module alte Verweise auf Objekte beibehalten hatten, weshalb Änderungen nicht in allen Teilen der Anwendung angewendet wurden.