W Pythonie przestrzeń nazw (namespace) to słownik, w którym nazwiska i obiekty są powiązane. Poziomy przestrzeni nazw: lokalny, globalny, wbudowany. Moduły to osobne przestrzenie do organizacji kodu. Podczas importu Python tworzy nową przestrzeń nazw dla każdego modułu.
import module — importuje moduł i umożliwia dostęp do obiektów przez module.name.from module import name — importuje obiekt z modułu bezpośrednio do bieżącej przestrzeni (ryzyko konfliktów nazw).as — pozwala ustawić alias.Aby uniknąć konfliktów nazw:
import mymodule), a nie gwiazdki (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
Pytanie: Czym się różni wielokrotne importowanie modułu? Czy cały kod modułu będzie wykonany ponownie?
Odpowiedź: Nie. Przy pierwszym imporcie moduł jest wykonywany, a wynik jest buforowany w sys.modules. Powtórny import zwraca już załadowany obiekt modułu, a jego kod nie jest wykonywany ponownie.
# module.py print('Hello!') # main.py import module # wyświetli Hello! import module # nic nie zostanie wyświetlone
Historia
from settings import * w kilku modułach, w wyniku czego przy zmianie ustawień niespodziewanie "przypisywały się" lokalne zmienne, wywołując trudne do zidentyfikowania błędy.Historia
utils.py). Na etapie integracji moduły o "identycznej" nazwie "podmieniały" się nawzajem, prowadząc do nieoczekiwanego zachowania i złożonych błędów.Historia
W jednej z bibliotek próbowano "gorąco zaktualizować" moduł z nowymi ustawieniami za pomocą importlib.reload. Nie uwzględniono, że już zaimportowane inne moduły zachowały stare odniesienia do obiektów, przez co zmiany nie były stosowane we wszystkich częściach aplikacji.