Historie van de kwestie
Namespaces zijn een van de basisconcepten van Python, aanwezig sinds de eerste implementaties van de taal. Ze zijn bedoeld om namen te organiseren om conflicten tussen variabelen, functies en klassen van verschillende delen van het programma te vermijden.
Probleem
In grote projecten zijn er veel functies, klassen, variabelen en modules. Zonder correct gebruik van namespaces is het mogelijk om belangrijke namen te overschrijven, onverwachte schaduwen van variabelen te krijgen en problemen te ondervinden bij testen en uitbreiden.
Oplossing
In Python is een namespace een mapping die namen aan objecten koppelt. Er zijn verschillende niveaus van namespaces: lokaal, globaal, module namespaces, en klassen. Het begrijpen van deze indeling garandeert de juiste toegang tot de benodigde objecten en minimaliseert conflicten.
Code voorbeeld:
def foo(): x = 10 # x in de lokale namespace van de functie print(x) y = 20 # y in de globale namespace van de module foo() print(y)
Belangrijke kenmerken:
Wat gebeurt er als je in dezelfde functie een lokale variabele met dezelfde naam als een globale declareert?
De lokale "overheerst" de globale tijdens de uitvoering van de functie; buiten de functie blijft de globale onveranderd.
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
Hoe krijg je een lijst van alle namen in de huidige namespace?
De functies locals(), globals(), dir() retourneren de bijbehorende mappings of lijsten van namen in de huidige zichtbaarheid/namespace.
Wat is het verschil tussen class namespaces en instance namespaces?
De class namespace definieert attributen die gemeenschappelijk zijn voor alle instanties van de klasse. De instance namespace zijn de attributen van een specifiek object. Wijzigingen in de instance beïnvloeden de klasse niet, en vice versa.
We gebruikten from mymodule import * in alle delen van een groot project. Uiteindelijk zijn de namen van functies overschreven, en ontstonden moeilijk te traceren bugs door naamconflicten tussen packages.
Voordelen:
Nadelen:
Overgestapt op import aliassen (import mymodule as mm), duidelijke structurering van modules.
Voordelen:
Nadelen: