¿De qué se tratan los espacios de nombres de Python?

Acabo de comenzar a aprender Python y he encontrado el concepto de “espacios de nombres” en Python. Si bien entendí lo que es, pero soy incapaz de apreciar la gravedad de este concepto.

Algunas búsquedas en la red revelaron que una de las razones por las que PHP va en contra es que no tiene soporte nativo para los espacios de nombres.

Alguien podría explicar cómo usar los espacios de nombres y cómo esta función hace que la progtwigción sea mejor (no solo en Python, ya que supongo que los espacios de nombres no son un concepto limitado a un idioma en particular).

Vengo predominantemente de Java y C fondos de progtwigción.

El espacio de nombres es una forma de implementar el scope.

En Java (o C), el comstackdor determina dónde se puede ver una variable a través del análisis de scope estático.

  • En C, el scope es el cuerpo de una función o es global o es externo. El comstackdor lo resuelve por usted y resuelve cada nombre de variable en función de las reglas de scope. El enlazador resuelve los nombres externos después de comstackr todos los módulos.

  • En Java, scope es el cuerpo de una función de método, o todos los métodos de una clase. Algunos nombres de clase también tienen un scope de nivel de módulo. Nuevamente, el comstackdor lo calcula en el momento de la comstackción y resuelve cada nombre basándose en las reglas de scope.

En Python, cada paquete, módulo, clase, función y función de método posee un “espacio de nombres” en el que se resuelven los nombres de las variables. Además, hay un espacio de nombres global que se usa si el nombre no está en el espacio de nombres local.

Cada nombre de variable se verifica en el espacio de nombres local (el cuerpo de la función, el módulo, etc.) y luego se verifica en el espacio de nombres global.

Las variables generalmente se crean solo en un espacio de nombres local. Las declaraciones global y nonlocal pueden crear variables que no sean el espacio de nombres local.

Cuando se evalúa una función, una función de método, un módulo o un paquete (es decir, se inicia la ejecución) se crea un espacio de nombres. Piense en ello como un “contexto de evaluación”. Cuando una función o una función de método, etc., finaliza la ejecución, el espacio de nombres se elimina. Las variables se caen. Los objetos pueden caer, también.

Los espacios de nombres evitan conflictos entre clases, métodos y objetos con el mismo nombre que podrían haber escrito diferentes personas.

Desde un fondo de Java, probablemente esté familiarizado con cómo se logra esto utilizando paquetes, por ejemplo, puede crear una clase movieyoda.DateUtils y puedo crear una clase mikej.DateUtils y el paquete permite que el código use las clases para distinguirlas. (Python tiene algo muy similar .)

Los espacios de nombres se agregaron a PHP en 5.3.0 pero en versiones anteriores (y en otros idiomas que no proporcionan espacios de nombres) tendría que prefijar los nombres de sus clases y métodos con algo para reducir el riesgo de un conflicto de nombres. por ejemplo, una función movieyoda_parse_file .

Para comprender los espacios de nombres, también debe tener cierta comprensión de los módulos en Python. Un módulo es simplemente un archivo que contiene código Python. Este código puede tener la forma de clases, funciones de Python o solo una lista de nombres. Cada módulo obtiene sus propios espacios de nombres globales. Por lo tanto, no puede tener dos clases o dos funciones en el mismo módulo con el mismo nombre, ya que comparten el espacio de nombres del módulo.

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

Si realiza un gran progtwig con otra persona, puede escribir su propia parte del progtwig como desee. Todas las variables en el archivo serán privadas, no habrá colisiones. Cuando escribe progtwigs PHP, es fácil reescribir variables globales por error. En Python puede importar otras variables de módulos si lo desea, y serán “globales” en su módulo.

Podrías pensar que un archivo de un objeto en Python. Cuando escribe progtwigs PHP, puede lograr lo mismo escribiendo clases con variables de instancia.

Completo la respuesta de S.Lott.

Diría que, espacio de nombres es una forma de implementar la administración de nombres dentro de un ámbito, porque un ámbito hace más que la administración de nombres.

En C los ámbitos son de 4 tipos: global, función, bloque y función-parámetros (prototipo). Cada uno de estos tipos puede crear uno o más espacios de nombres, según las necesidades. Hay 4 ns en C – tags para s / u / e – ids para nombres tipográficos, nombres de funciones y var. Parámetros dentro de la función prototype – miembros y campos de bits dentro de s / u.

De esa manera, los identificadores de tags y los nombres de funciones no chocan, pero los nombres de tipos definidos por typedef pueden chocar con nombres de variables.

En Python hay un espacio de nombres incorporado que encierra los ns globales, y el módulo cargado proporciona los ns globales. Los ns incorporados contienen variables. Un símbolo para una variable puede definir un objeto o una función, por ejemplo, + se define allí. La ns global del módulo dura hasta la terminación.

Vea también eso y por supuesto eso .