2010-10-12 6 views
31

Ich habe gerade angefangen zu lernen Python & sind über "Namespaces" Konzept in Python. Ich habe zwar den Eindruck von dem, was es ist, aber ich bin nicht in der Lage, die Schwere dieses Konzepts zu erkennen.Was sind Python Namespaces alles über

Einige im Internet surfen ergab, dass einer der Gründe gegen PHP ist, dass es keine native Unterstützung für Namespaces hat.

Könnte jemand erklären, wie & Namespaces verwenden, wie diese Funktion Programmierung besser (nicht nur in Python, wie ich annehme Namespaces in kein Konzept beschränkt sich auf eine bestimmte Sprache) macht.

Ich komme überwiegend aus Java und C Programmierung Hintergründe.

+2

Einige andere PHP Kerl hatte Probleme mit Namespaces vor ein paar Stunden: http://stackoverflow.com/questions/3909002/ Könnte lesenswert sein. –

Antwort

36

Namespace ist eine Möglichkeit, den Gültigkeitsbereich zu implementieren.

In Java (oder C) bestimmt der Compiler, wo eine Variable durch statische Scope-Analyse sichtbar ist.

  • In C ist scope entweder der Körper einer Funktion oder es ist global oder es ist extern. Der Compiler begründet dies für Sie und löst jeden Variablennamen basierend auf Bereichsregeln auf. Externe Namen werden vom Linker aufgelöst, nachdem alle Module kompiliert wurden.

  • In Java ist scope der Körper einer Methodenfunktion oder alle Methoden einer Klasse. Einige Klassennamen haben auch einen Gültigkeitsbereich auf Modulebene. Der Compiler ermittelt dies wiederum zur Kompilierzeit und löst jeden Namen basierend auf den Bereichsregeln auf.

  • In Python besitzt jede Paket-, Modul-, Klassen-, Funktions- und Methodenfunktion einen "Namespace", in dem Variablennamen aufgelöst werden. Außerdem gibt es einen globalen Namespace, der verwendet wird, wenn der Name nicht im lokalen Namespace enthalten ist.

    Jeder Variablenname wird im lokalen Namespace (dem Rumpf der Funktion, dem Modul usw.) überprüft und dann im globalen Namespace überprüft.

    Variablen werden in der Regel nur in einem lokalen Namespace erstellt. Die global und nonlocal Aussagen können Variablen in einem anderen als dem lokalen Namespace erstellen.

    Wenn eine Funktion, Methodenfunktion, Modul oder Paket ausgewertet wird (das heißt, beginnt die Ausführung) ein Namensraum erstellt wird. Betrachten Sie es als einen "Evaluationskontext". Wenn eine Funktion oder eine Methodenfunktion usw. die Ausführung beendet, wird der Namespace gelöscht. Die Variablen werden gelöscht. Die Objekte können auch fallen gelassen werden.

    +1

    Namespace ist ein Weg, Namensverwaltung in einem Umfang zu implementieren, weil ein Bereich ist mehr als Name-Management. Sieh meine Antwort. – alinsoar

    3

    Um Namespaces zu verstehen, müssen Sie auch ein wenig Verständnis für Module in Python haben. Ein Modul ist einfach eine Datei, die Python-Code enthält. Dieser Code kann in Form von Python-Klassen, Funktionen oder nur einer Liste von Namen vorliegen. Jedes Modul erhält seine eigenen globalen Namespaces. Sie können also nicht zwei Klassen oder zwei Funktionen im selben Modul mit demselben Namen haben, da sie den Namensraum des Moduls teilen.

    Referenz: http://bytebaker.com/2008/07/30/python-namespaces/

    5

    Namensräume verhindern Konflikte zwischen den Klassen, Methoden und Objekten mit dem gleichen Namen, die von verschiedenen Personen geschrieben worden sein könnte.

    Ausgehend von einem Java-Hintergrund sind Sie wahrscheinlich vertraut, wie dies erreicht wird mit Paketen z. Sie könnten eine movieyoda.DateUtils Klasse erstellen und ich kann eine mikej.DateUtils Klasse erstellen und das Paket ermöglicht Code mit den Klassen, um zwischen ihnen zu unterscheiden. (Python

    .)

    Namespaces wurden zu PHP in 5.3.0 hinzugefügt, aber in früheren Versionen (und in anderen Sprachen, die keine Namespaces bereitstellen) müssten Sie Ihren Klassen- und Methodennamen mit etwas vorangestellt werden, um den zu reduzieren Risiko eines Namenskonflikts. z.B. eine movieyoda_parse_file Funktion.

    0

    Wenn Sie ein großes Programm mit jemand anderem machen, könnten Sie Ihren eigenen Teil des Programms schreiben, wie Sie wollen. Alle Variablen in der Datei sind privat, es wird keine Kollisionen geben. Wenn Sie PHP-Programme schreiben, ist es leicht, globale Variablen versehentlich neu zu schreiben. In Python können Sie andere Modulvariablen importieren, wenn Sie möchten, und sie sind in Ihrem Modul "global".

    Sie könnten eine Datei ein Objekt in Python denken. Wenn Sie PHP-Programme schreiben, können Sie dasselbe erreichen, indem Sie Klassen mit Instanzvariablen schreiben.

    0

    ich die Antwort von S.Lott abzuschließen.

    Ich würde sagen, Namespace ist eine Möglichkeit, Namensverwaltung in einem Bereich zu implementieren, da ein Bereich mehr als nur die Verwaltung von Namen.

    In C sind die Bereiche von 4 Typen: global, Funktion, Block und Funktionsparameter (Prototyp). Jede dieser Arten kann je nach Bedarf einen oder mehrere Namespaces erstellen. Es gibt 4 ns in C - Tags für s/u/e - IDs für Typnamen, Funktionsnamen und Variablennamen - Parameter innerhalb der Funktion Prototyp - Mitglieder und Bitfelder in s/u.

    So kollidieren Tag-Bezeichner und Funktionsnamen nicht, aber Typnamen, die von typedef definiert werden, können mit Variablennamen kollidieren.

    In Python gibt es einen eingebauten Namespace, der das globale ns umschließt, und das globale ns wird vom geladenen Modul bereitgestellt. Die Builtins enthalten Variablen. Ein Symbol für eine Variable kann ein Objekt oder eine Funktion definieren - dort ist zB + definiert. Die globalen ns des Moduls bleiben bis zur Beendigung bestehen.

    Siehe auch that und natürlich that.