De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

En informática , un espacio de nombres es un conjunto de signos ( nombres ) que se utilizan para identificar y hacer referencia a objetos de varios tipos. Un espacio de nombres garantiza que todo un conjunto de objetos determinado tenga nombres únicos para que puedan identificarse fácilmente .

Los espacios de nombres se estructuran comúnmente como jerarquías para permitir la reutilización de nombres en diferentes contextos. Como analogía, considere un sistema de nomenclatura de personas donde cada persona tiene un nombre de pila, así como un apellido compartido con sus familiares. Si los nombres de los miembros de la familia son únicos solo dentro de cada familia, entonces cada persona puede ser identificada de manera única por la combinación de nombre y apellido; solo hay una Jane Doe, aunque puede haber muchas Jane. Dentro del espacio de nombres de la familia Doe, solo "Jane" es suficiente para designar sin ambigüedades a esta persona, mientras que dentro del espacio de nombres "global" de todas las personas, se debe usar el nombre completo.

Entre los ejemplos destacados de espacios de nombres se incluyen los sistemas de archivos , que asignan nombres a los archivos. [1] Algunos lenguajes de programación organizan sus variables y subrutinas en espacios de nombres. [2] [3] [4] Las redes de computadoras y los sistemas distribuidos asignan nombres a los recursos, como computadoras, impresoras, sitios web y archivos remotos. Los sistemas operativos pueden dividir los recursos del kernel mediante espacios de nombres aislados para admitir contenedores de virtualización .

De manera similar, los sistemas de archivos jerárquicos organizan los archivos en directorios. Cada directorio es un espacio de nombres separado, por lo que los directorios "cartas" y "facturas" pueden contener un archivo "to_jane".

En la programación de computadoras , los espacios de nombres se emplean típicamente con el propósito de agrupar símbolos e identificadores alrededor de una funcionalidad particular y para evitar colisiones de nombres entre múltiples identificadores que comparten el mismo nombre.

En la creación de redes, el sistema de nombres de dominio organiza los sitios web (y otros recursos) en espacios de nombres jerárquicos .

Conflictos de nombres [ editar ]

Los nombres de los elementos los define el desarrollador. Esto a menudo resulta en un conflicto al intentar mezclar documentos XML de diferentes aplicaciones XML.

Este XML lleva información de la tabla HTML :

<table>  <tr>  <td> Manzanas </td>  <td> Naranjas </td>  </tr> </table>

Este XML contiene información sobre una mesa (es decir, un mueble):

<table>  <name> Mesa de centro africana </name>  <width> 80 </width>  <length> 120 </length> </table>

Si estos fragmentos XML se agregan juntos, habría un conflicto de nombres. Ambos contienen un <table>...</table>elemento, pero los elementos tienen diferente contenido y significado.

Un analizador XML no sabrá cómo manejar estas diferencias.

Solución mediante prefijo [ editar ]

Los conflictos de nombres en XML se pueden evitar fácilmente utilizando un prefijo de nombre.

El siguiente XML distingue entre la información sobre la tabla HTML y el mobiliario mediante el prefijo "h" y "f" al comienzo de los elementos.

<h: table>  <h: tr>  <h: td> Manzanas </ h: td>  <h: td> Naranjas </ h: td>  </ h: tr> </ h: table><f: table>  <f: name> African Coffee Table </ f: name>  <f: width> 80 </ f: width>  <f: length> 120 </ f: length> </ f: table>

Sistema de nombres [ editar ]

Un nombre en un espacio de nombres consta de un identificador de espacio de nombres y un nombre local. [5] [6] El nombre del espacio de nombres se suele aplicar como prefijo del nombre local.

En forma aumentada de Backus – Naur :

nombre = <identificador de espacio de nombres> separador <nombre local>

Cuando los nombres locales se usan por sí mismos, la resolución de nombres se usa para decidir a qué nombre particular (si lo hay) se alude por algún nombre local particular.

Ejemplos [ editar ]

Delegación [ editar ]

La delegación de responsabilidades entre las partes es importante en aplicaciones del mundo real, como la estructura de la World Wide Web. Los espacios de nombres permiten la delegación de la asignación de identificadores a varias organizaciones emisoras de nombres, al tiempo que conservan la singularidad global. [8] Una autoridad de registro central registra los identificadores de espacio de nombres asignados asignados . Cada identificador de espacio de nombres se asigna a una organización que posteriormente es responsable de la asignación de nombres en su espacio de nombres asignado. Esta organización puede ser una organización emisora ​​de nombres que asignan los nombres ellos mismos, u otra autoridad de registro que delega además partes de su espacio de nombres a diferentes organizaciones.

Jerarquía[ editar ]

Un esquema de nombres que permite la subdelegación de espacios de nombres a terceros es un espacio de nombres jerárquico .

Una jerarquía es recursiva si la sintaxis de los identificadores de espacio de nombres es la misma para cada subdelegación. Un ejemplo de jerarquía recursiva es el sistema de nombres de dominio .

Un ejemplo de una jerarquía no recursiva es el Nombre de recurso uniforme que representa un número de Autoridad de números asignados de Internet (IANA).

Espacio de nombres versus alcance [ editar ]

Un identificador de espacio de nombres puede proporcionar contexto ( alcance en informática) a un nombre, y los términos a veces se usan indistintamente. Sin embargo, el contexto de un nombre también puede ser proporcionado por otros factores, como la ubicación donde aparece o la sintaxis del nombre.

En lenguajes de programación [ editar ]

Para muchos lenguajes de programación, el espacio de nombres es un contexto para sus identificadores . En un sistema operativo, un ejemplo de espacio de nombres es un directorio. Cada nombre de un directorio identifica de forma exclusiva un archivo o subdirectorio. [9]

Como regla, los nombres en un espacio de nombres no pueden tener más de un significado; es decir, diferentes significados no pueden compartir el mismo nombre en el mismo espacio de nombres. Un espacio de nombres también se denomina contexto , porque el mismo nombre en diferentes espacios de nombres puede tener diferentes significados, cada uno apropiado para su espacio de nombres.

A continuación se muestran otras características de los espacios de nombres:

  • Los nombres en el espacio de nombres pueden representar tanto objetos como conceptos , ya sea el espacio de nombres un lenguaje natural o étnico , un lenguaje construido , la terminología técnica de una profesión, un dialecto , un sociolecto o un lenguaje artificial (por ejemplo, un lenguaje de programación ).
  • En el lenguaje de programación Java , los identificadores que aparecen en los espacios de nombres tienen un nombre corto (local) y un nombre "calificado" largo único para su uso fuera del espacio de nombres.
  • Algunos compiladores (para lenguajes como C ++ ) combinan espacios de nombres y nombres para uso interno en el compilador en un proceso llamado manipulación de nombres .

Además de su uso técnico del lenguaje abstracto como se describe anteriormente, algunos lenguajes tienen una palabra clave específica utilizada para el control explícito del espacio de nombres, entre otros usos. A continuación se muestra un ejemplo de un espacio de nombres en C ++:

#include  <iostream>// Así es como se trae un nombre al ámbito actual. En este caso, // los está trayendo al alcance global. usando  std :: cout ; usando  std :: endl ;espacio de nombres  box1  {  int  box_side  =  4 ; }espacio de nombres  box2  {  int  box_side  =  12 ; }int  main ()  {  int  box_side  =  42 ;  cout  <<  box1 :: box_side  <<  endl ;  // Resultados 4.  cout  <<  box2 :: box_side  <<  endl ;  // Resultados 12.  cout  <<  box_side  <<  endl ;  // Resultados 42. }

Consideraciones sobre informática [ editar ]

Un espacio de nombres en informática (a veces también llamado ámbito de nombres ) es un contenedor o entorno abstracto creado para contener una agrupación lógica de identificadores o símbolos únicos (es decir, nombres). Un identificador definido en un espacio de nombres está asociado solo con ese espacio de nombres. El mismo identificador se puede definir de forma independiente en varios espacios de nombres. Es decir, un identificador definido en un espacio de nombres puede tener o no el mismo significado que el mismo identificador definido en otro espacio de nombres. Los lenguajes que admiten espacios de nombres especifican las reglas que determinan a qué espacio de nombres pertenece un identificador (no su definición). [10]

Este concepto se puede ilustrar con una analogía. Imagine que dos empresas, X e Y, asignan cada una números de identificación a sus empleados. X no debe tener dos empleados con el mismo número de identificación, y lo mismo para Y; pero no es un problema que se utilice el mismo número de identificación en ambas empresas. Por ejemplo, si Bill trabaja para la empresa X y Jane trabaja para la empresa Y, entonces no es un problema que cada uno de ellos sea el empleado # 123. En esta analogía, el número de identificación es el identificador y la empresa sirve como espacio de nombres. No causa problemas para el mismo identificador identificar a una persona diferente en cada espacio de nombres.

En grandes programas o documentos informáticos , es común tener cientos o miles de identificadores. Los espacios de nombres (o una técnica similar, consulte Emulación de espacios de nombres ) proporcionan un mecanismo para ocultar identificadores locales. Proporcionan un medio para agrupar identificadores relacionados lógicamente en espacios de nombres correspondientes, lo que hace que el sistema sea más modular .

Los dispositivos de almacenamiento de datos y muchos lenguajes de programación modernos admiten espacios de nombres. Los dispositivos de almacenamiento utilizan directorios (o carpetas) como espacios de nombres. Esto permite almacenar dos archivos con el mismo nombre en el dispositivo siempre que estén almacenados en directorios diferentes. En algunos lenguajes de programación (por ejemplo, C ++ , Python ), los identificadores que nombran los espacios de nombres están asociados con un espacio de nombres adjunto. Por lo tanto, en estos idiomas, los espacios de nombres pueden anidar, formando un árbol de espacios de nombres . En la raíz de este árbol se encuentra el espacio de nombres global sin nombre .

Usar en idiomas comunes [ editar ]

C

Es posible utilizar estructuras anónimas como espacios de nombres en C desde C99 .

// helper.c static  int  _add ( int  a ,  int  b )  {  return  a  +  b ; }const  struct  {  doble  pi ;  int  ( * agregar )  ( int ,  int ); }  ayudante  =  {  3.14 ,  _add  };// helper.h const  struct  {  double  pi ;  int  ( * agregar )  ( int ,  int ); }  ayudante ;// main.c #include  <stdio.h>#include  "helper.h"int  main () {  printf ( "3 + 2 =% d \ n " ,  helper . add ( 3 ,  2 ));  printf ( "pi es% f \ n " ,  ayudante . pi ); }
C ++

En C ++ , un espacio de nombres se define con un bloque de espacio de nombres. [11]

espacio de nombres  abc  {  int  bar ; }

Dentro de este bloque, los identificadores se pueden usar exactamente como se declaran. Fuera de este bloque, el especificador de espacio de nombres debe tener un prefijo. Por ejemplo, fuera de namespace abc, bardebe escribirse abc::barpara poder acceder. C ++ incluye otra construcción que hace innecesaria esta verbosidad. Añadiendo la línea

usando el  espacio de nombres  abc ;

a un fragmento de código, el prefijo abc::ya no es necesario.

Los identificadores que no se declaran explícitamente dentro de un espacio de nombres se consideran en el espacio de nombres global.

int  foo ;

Estos identificadores se pueden usar exactamente como se declaran o, dado que el espacio de nombres global no tiene nombre, el especificador de espacio de nombres ::puede tener un prefijo. Por ejemplo, footambién se puede escribir ::foo.

La resolución del espacio de nombres en C ++ es jerárquica. Esto significa que dentro del espacio de nombres hipotético food::soup, el identificador se chickenrefiere a food::soup::chicken. Si food::soup::chickenno existe, entonces se refiere a food::chicken. Si no existe food::soup::chickenni food::chicken, se chickenrefiere a ::chickenun identificador en el espacio de nombres global.

Los espacios de nombres en C ++ se utilizan con mayor frecuencia para evitar colisiones de nombres . Aunque los espacios de nombres se utilizan ampliamente en el código C ++ reciente, la mayoría del código antiguo no utiliza esta función porque no existía en las primeras versiones del lenguaje. Por ejemplo, toda la biblioteca estándar de C ++ se define dentro namespace std, pero antes de la estandarización, muchos componentes estaban originalmente en el espacio de nombres global. Un programador puede insertar la usingdirectiva para omitir los requisitos de resolución del espacio de nombres y obtener compatibilidad con el código anterior que espera que todos los identificadores estén en el espacio de nombres global. Sin embargo, el uso de la usingdirectiva por razones distintas a la compatibilidad con versiones anteriores (por ejemplo, conveniencia) se considera contrario a las buenas prácticas de código.

Java

En Java , la idea de un espacio de nombres está incorporada en los paquetes de Java . Todo el código pertenece a un paquete, aunque ese paquete no necesita ser nombrado explícitamente. Se accede al código de otros paquetes colocando el prefijo del nombre del paquete antes del identificador apropiado, por ejemplo, se puede hacer referencia a class Stringin (esto se conoce como el nombre de clase completo ). Como C ++, Java ofrece una construcción que hace innecesario escribir el nombre del paquete ( ). Sin embargo, ciertas características (como la reflexión ) requieren que el programador utilice el nombre completo.package java.langjava.lang.Stringimport

A diferencia de C ++, los espacios de nombres en Java no son jerárquicos en lo que respecta a la sintaxis del lenguaje. Sin embargo, los paquetes se nombran de forma jerárquica. Por ejemplo, todos los paquetes que comienzan con javason parte de la plataforma Java ; el paquete java.langcontiene clases centrales del lenguaje y java.lang.reflectcontiene clases centrales específicamente relacionadas con la reflexión.

En Java (y Ada , C # y otros), los espacios de nombres / paquetes expresan categorías semánticas de código. Por ejemplo, en C #, namespace Systemcontiene código proporcionado por el sistema ( .NET Framework ). Cuán específicas son estas categorías y cuán profundas son las jerarquías difieren de un idioma a otro.

Los ámbitos de función y clase se pueden ver como espacios de nombres implícitos que están inextricablemente vinculados con la visibilidad, la accesibilidad y la vida útil del objeto .

C#

Los espacios de nombres se utilizan mucho en el lenguaje C #. Todas las clases de .NET Framework están organizadas en espacios de nombres, para que se puedan usar con mayor claridad y evitar el caos. Además, los programadores utilizan ampliamente los espacios de nombres personalizados, tanto para organizar su trabajo como para evitar colisiones de nombres . Al hacer referencia a una clase, se debe especificar su nombre completo, que significa espacio de nombres seguido del nombre de la clase,

Sistema . Consola . WriteLine ( "¡Hola mundo!" ); int  i  =  Sistema . Convertir . ToInt32 ( "123" );

o agregue una declaración de uso . Esto elimina la necesidad de mencionar el nombre completo de todas las clases en ese espacio de nombres.

usando el  sistema ;Consola . WriteLine ( "¡Hola mundo!" ); int  i  =  Convertir . ToInt32 ( "123" );

En los ejemplos anteriores, System es un espacio de nombres y Console y Convert son clases definidas dentro de System .

Pitón

En Python , los espacios de nombres se definen mediante módulos individuales y, dado que los módulos pueden estar contenidos en paquetes jerárquicos, los espacios de nombres también son jerárquicos. [12] [13] En general, cuando se importa un módulo, los nombres definidos en el módulo se definen a través del espacio de nombres de ese módulo y se accede a ellos desde los módulos de llamada utilizando el nombre completo.

# asumir module define dos funciones: func1 () y func2 () y una clase: Class1 import  ModuleaModulea . func1 () Modulea . func2 () a  =  Modulea . Clase1 ()

La from ... import ...declaración se puede usar para insertar los nombres relevantes directamente en el espacio de nombres del módulo de llamada, y se puede acceder a esos nombres desde el módulo de llamada sin el nombre calificado:

# suponga que Modulea define dos funciones: func1 () y func2 () y una clase: Class1 de  Modulea  import  func1func1 () func2 ()  # esto fallará como un nombre indefinido, al igual que el nombre completo Modulea.func2 () a  =  Class1 ()  # esto fallará como un nombre indefinido, al igual que el nombre completo Modulea.Class1 ()

Dado que esto importa directamente nombres (sin calificación), puede sobrescribir nombres existentes sin advertencias.

Una forma especial de la declaración es la from ... import *que importa todos los nombres definidos en el paquete nombrado directamente en el espacio de nombres del módulo de llamada. El uso de esta forma de importación, aunque es compatible con el idioma, generalmente se desaconseja ya que contamina el espacio de nombres del módulo de llamada y hará que los nombres ya definidos se sobrescriban en el caso de conflictos de nombres. [14]

Python también admite import x as ycomo una forma de proporcionar un alias o un nombre alternativo para que lo use el módulo de llamada:

importar  numpy  como  npa  =  np . naranja ( 1000 )
Espacio de nombres XML

En XML , la especificación del espacio de nombres XML permite que los nombres de los elementos y atributos en un documento XML sean únicos, similar a la función de los espacios de nombres en los lenguajes de programación. Al utilizar espacios de nombres XML, los documentos XML pueden contener nombres de elementos o atributos de más de un vocabulario XML.

PHP

Los espacios de nombres se introdujeron en PHP a partir de la versión 5.3. Se puede evitar la colisión de nombres de clases, funciones y variables. En PHP , un espacio de nombres se define con un bloque de espacio de nombres.

# Archivo phpstar / foobar.phpespacio de nombres  phpstar ;class  FooBar {  función pública  foo () : void { echo 'Hola mundo, de la función foo' ; }        barra de función  pública () : void { echo 'Hola mundo, desde la barra de función' ; } }     

Podemos hacer referencia a un espacio de nombres PHP de las siguientes formas diferentes:

# Archivo index.php# Incluya el archivo include  "phpstar / foobar.php" ;# Opción 1: prefijo directamente el nombre de la clase con el espacio de  nombres $ obj_foobar =  new  \ phpstar \ FooBar ();# Opción 2: importar el espacio de nombres use  phpstar \ FooBar ; $ obj_foobar  =  new  FooBar ();# Opción 2a: importar y alias el espacio de nombres use  phpstar \ FooBar  como  FB ; $ obj_foobar  =  nuevo  FB ();# Acceda a las propiedades y métodos de forma regular $ obj_foobar -> foo (); $ obj_foobar -> bar ();

Emulando espacios de nombres [ editar ]

En los lenguajes de programación que carecen de soporte de lenguaje para espacios de nombres, los espacios de nombres se pueden emular hasta cierto punto mediante el uso de una convención de nomenclatura de identificadores . Por ejemplo, las bibliotecas C como libpng a menudo usan un prefijo fijo para todas las funciones y variables que forman parte de su interfaz expuesta. Libpng expone identificadores como:

png_create_write_structpng_get_signaturepng_read_rowpng_set_invalid

Esta convención de nomenclatura proporciona una garantía razonable de que los identificadores son únicos y, por lo tanto, se pueden utilizar en programas más grandes sin colisiones de nombres . [15] Asimismo, muchos paquetes escritos originalmente en Fortran (por ejemplo, BLAS , LAPACK ) reservan las primeras letras del nombre de una función para indicar a qué grupo pertenece.

Esta técnica tiene varios inconvenientes:

  • No se adapta bien a los espacios de nombres anidados; los identificadores se vuelven excesivamente largos ya que todos los usos de los identificadores deben estar completamente calificados para el espacio de nombres .
  • Los individuos u organizaciones pueden usar convenciones de nomenclatura inconsistentes, lo que podría introducir una ofuscación no deseada.
  • Las operaciones compuestas o "basadas en consultas" en grupos de identificadores, basadas en los espacios de nombres en los que se declaran, se vuelven difíciles de manejar o inviables.
  • En idiomas con longitud de identificador restringida, el uso de prefijos limita la cantidad de caracteres que se pueden usar para identificar lo que hace la función. Este es un problema particular para los paquetes escritos originalmente en FORTRAN 77 , que ofrecían solo 6 caracteres por identificador. Por ejemplo, el nombre de la función BLASDGEMM indica que opera con números de doble precisión ("D") y matrices generales ("GE"), y solo los dos últimos caracteres muestran lo que realmente hace: multiplicación matriz-matriz ( el "MM").

Hay varias ventajas:

  • No se requieren herramientas de software especiales para localizar nombres en archivos de código fuente. Un programa simple como grep es suficiente.
  • No hay conflictos de nombres de espacios de nombres.
  • No hay necesidad de alterar los nombres y, por lo tanto, no hay problemas potenciales de incompatibilidad.

Ver también [ editar ]

  • Código postal del punto de entrega de 11 dígitos
  • Nomenclatura binomial (género-especie en biología )
  • Nomenclatura química
  • Clasificación decimal de Dewey
  • Identificador de Objeto Digital
  • sistema de nombres de dominio
  • Identidad (programación orientada a objetos)
  • Clasificación de la Biblioteca del Congreso
  • Catálogos de estrellas y convenciones de nombres astronómicos
  • Espacio de nombres XML
  • Búsqueda de nombre dependiente del argumento

Referencias [ editar ]

  1. ^ Adya, Atul; Bolosky, William; Castro, Miguel; Cermak, Gerald; Chaiken, Ronnie; Douceur, John; Howell, Jon; Lorch, Jacob; Theimer, Marvin; Wattenhofer, Roger (2002). FARSITE: almacenamiento federado, disponible y confiable para un entorno de poca confianza (PDF) . Proc. USENIX Symp. sobre Diseño e Implementación de Sistemas Operativos. Archivado desde el original (PDF) el 28 de julio de 2010. La construcción principal establecida por un sistema de archivos es un espacio de nombres de directorio jerárquico, que es el depósito lógico de archivos.
  2. ^ "Preguntas frecuentes de C #: qué es un espacio de nombres" . http://en.csharp-online.net/ : C # Online Net. Archivado desde el original el 20 de octubre de 2013 . Consultado el 23 de febrero de 2010 . Un espacio de nombres no es más que un grupo de ensamblados, clases o tipos. Un espacio de nombres actúa como un contenedor, como una carpeta de disco, para las clases organizadas en grupos, generalmente según la funcionalidad. La sintaxis del espacio de nombres de C # permite anidar los espacios de nombres.
  3. ^ "Una descripción general de los espacios de nombres en PHP" . Manual de PHP . ¿Qué son los espacios de nombres? En la definición más amplia, los espacios de nombres son una forma de encapsular elementos. Esto puede verse como un concepto abstracto en muchos lugares. Por ejemplo, en cualquier sistema operativo, los directorios sirven para agrupar archivos relacionados y actúan como un espacio de nombres para los archivos dentro de ellos.
  4. ^ "Creación y uso de paquetes" . Documentación de Java . Oráculo. Un paquete es una agrupación de tipos relacionados que proporciona protección de acceso y gestión del espacio de nombres. Tenga en cuenta que los tipos se refieren a clases, interfaces, enumeraciones y tipos de anotaciones. Las enumeraciones y los tipos de anotaciones son tipos especiales de clases e interfaces, respectivamente, por lo que en esta lección a menudo se hace referencia a los tipos simplemente como clases e interfaces.[se necesita una mejor fuente ]
  5. ^ XML Core Working Group (8 de diciembre de 2009). "Espacios de nombres en XML 1.0 (tercera edición)" . W3C . Consultado el 30 de marzo de 2012 .
  6. ^ Moats, Ryan (mayo de 1997). "Sintaxis" . Sintaxis URN . IETF . pag. 1 segundo. 2. doi : 10.17487 / RFC2141 . RFC 2141 . Consultado el 30 de marzo de 2012 .
  7. ^ Stephen J. Gowdy. "Lista de ID de USB" . 2013.
  8. ^ Sollins & Masinter (diciembre de 1994). "Requisitos de capacidades funcionales" . Requisitos funcionales para nombres uniformes de recursos . IETF . pag. 3. seg. 2. doi : 10.17487 / RFC1731 . RFC 1731 . Consultado el 30 de marzo de 2012 .
  9. ^ "Preguntas frecuentes de C #: qué es un espacio de nombres" . http://en.csharp-online.net/ : C # Online Net. Archivado desde el original el 20 de octubre de 2013 . Consultado el 23 de febrero de 2010 . Por ejemplo, [en Windows ], para acceder a las clases y miembros integrados de entrada-salida (E / S), use el espacio de nombres System.IO. O, para acceder a clases y miembros relacionados con la Web, utilice el espacio de nombres System.Web.
  10. ^ "Un espacio de nombres es" una agrupación lógica de los nombres utilizados dentro de un programa. " " . Webopedia.com . Consultado el 26 de julio de 2011 .
  11. ^ "Los espacios de nombres permiten agrupar entidades como clases, objetos y funciones bajo un nombre" . Cplusplus.com . Consultado el 26 de julio de 2011 .
  12. ^ "6. Módulos" . El tutorial de Python . Fundación de software Python . Consultado el 25 de octubre de 2010 .
  13. ^ "Ámbitos y espacios de nombres de Python" . Docs.python.org . Consultado el 26 de julio de 2011 .
  14. ^ https://docs.python.org/3/tutorial/modules.html "en general, la práctica de importar * desde un módulo o paquete está mal vista"
  15. ^ Danny Kalev. "Por qué odio los espacios de nombres" . Archivado desde el original el 9 de julio de 2016.CS1 maint: bot: estado de URL original desconocido ( enlace )