Namensräume und Geltungsbereiche

Namensräume

Namen als Namensräume

Allgemein gesprochen ist ein Namensraum (manchmal auch Kontext genannt) ein Benennungssystem, um Namen eindeutig zu machen und Mehrdeutigkeiten zu vermeiden. Ferner bezeichnet ein Namensraum einen Raum (oder Gebiet) innerhalb eines Programmes, in dem ein Variable gültig ist.

Namensräume kennt man nicht nur bei der Programmierung, sondern auch im Alltag:

  • Der einfachste Falle eines Namensraumes stellt beispielsweise unser Namenssystem bei Personen dar. Im Freundeskreis langt es oft von einem "Peter", "Guido" oder einer "Susanne" zu sprechen. Bei Mehrdeutigkeiten greifen wir dann auf den Familiennamen zu. Das bedeutet, dass ein Familienname einen Namensraum bezeichnet. Im Namensraum "Schmidt" haben wir dann die diversen Vornamen.
  • Ein weiteres Beispiel eines Namensraums finden wir bei der Telefonie. Fragt man beispielsweise einen Nachbarn nach seiner Telefonnummer, nennt dieser einem die Rufnummer ohne Vorwahl. Die Vorwahl stellt also einen Namensraum dar. Das bedeutet, dass eine Nummer wie z.B. die 3333 in der Stadt A mit der Vorwahl X einem Taxiunternehmen gehört und in der Stadt B mit der Vorwahl Y gehört diese Nummer möglicherweise einem Arzt. Die vollständigen Rufnummern also X/3333 und Y/3333 sind aber unterschiedlich.
  • Netzwerke: Jedes Netzwerk-Gerät (Arbeitsplatz, Server, Drucker,...) braucht einen eindeutigen Namen und Addresse.
  • Verzeichnisstrukturen in Dateisystemen liefern ein weiteres Beispiel. Der selbe Dateiname kann in verschiedenen Verzeichnissen verwendet werden. Der Zugriff ist nur über einen eindeutigen Pfad möglich.

Namensräume verhindern Namenskonflikte, d.h. dass man in verschiedenen Modulen zufällig gleiche Namen für Variablen, Funktionen usw. verwendet.

Viele Programmiersprachen verwenden Namensräume oder Geltunsbereiche für Bezeichner. Ein Bezeichner, der in einem Namensraum definiert ist, wird mit diesem Namensraum assoziiert. Auf diese Weise kann derselbe Bezeichner unabhängig voneinander in mehreren Namensräumen definiert werden (wie derselbe Dateiname in verschiedenen Verzeichnissen). Programmiersprachen, die Namensräume unterstützen, können unterschiedliche Regeln haben, die festlegen, zu welchem Namensraum ein Bezeichner gehört. Namensräume in Python sind als Python-Wörterbücher implementiert, d. h. sie werden durch eine Abbildung von Namen, d. h. den Schlüsseln des Wörterbuchs, auf Objekte, d. h. die Werte, definiert. Der Benutzer muss dies nicht wissen, um ein Python-Programm zu schreiben und wenn er Namensräume verwendet.

In Python gibt es drei Namensräume:

  1. Lokaler Geltungsbereich
    Namen sind innerhalb einer Methode oder Funktion definiert.
  2. Modularer Geltungsbereich
    Namen sind innerhalb einer Datei definiert.
  3. Eingebauter Geltungsbereich
    Innerhalb von Python definierte Namen sind immer gültig.

Lebensdauer eines Namensraums

Nicht jeder Namensraum, der in einem Skript oder Programm verwendet werden kann, ist zu jedem Zeitpunkt während der Ausführung des Skripts zugänglich (oder lebendig). Namensräume haben unterschiedliche Geltungszeiten, da sie oft zu unterschiedlichen Zeitpunkten angelegt werden. Es gibt einen Namensraum, der von Anfang bis Ende vorhanden ist: Der Namensraum, der die eingebauten Namen enthält, wird beim Start des Python-Interpreters angelegt und wird nie gelöscht. Der globale Namensraum eines Moduls wird erzeugt, wenn das Modul eingelesen wird. Modul-Namensräume bestehen normalerweise bis zum Ende des Skripts, d. h. bis zum Beenden des Interpreters. Wenn eine Funktion aufgerufen wird, wird ein lokaler Namensraum für diese Funktion erzeugt. Dieser Namensraum wird entweder gelöscht, wenn die Funktion endet, d. h. zurückkehrt, oder wenn die Funktion eine Ausnahme auslöst, die nicht innerhalb der Funktion behandelt wird.

Geltungsbereiche

Ein Geltungsbereich bezeichnet einen Bereich des Programms, in dem auf einen Namensraum direkt zugegriffen werden kann, ohne einen Namens-Präfix zu verwenden. Zum Beispiel innerhalb einer Funktion. Mit anderen Worten, der Geltungsbereich eines Namens ist der Bereich eines Programms, in dem dieser Name eindeutig verwendet werden kann, z. B. innerhalb einer Funktion. Der Namensraum eines Namens ist identisch mit seinem Geltungsbereich. Geltungsbereiche sind statisch definiert, werden aber dynamisch verwendet. Während der Programmausführung gibt es folgende verschachtelte Geltungsbereiche:

  • der innerste Geltungsbereich wird zuerst durchsucht und enthält die lokalen Namen
  • die Geltungsbereiche aller umschließenden Funktionen, die beginnend mit dem nächstgelegenen umschließenden Geltungsbereich durchsucht werden
  • der vorletzte Bereich enthält die globalen Namen des aktuellen Moduls
  • der äußerste Bereich, der als letzter durchsucht wird, ist der Namensraum, der die eingebauten Namen enthält.

Der Namensraum eines Namens ist identisch zu dessen Geltungsbereich. Geltungsbereiche sind statisch, werden aber dynamisch verwendet.