una modulos lista librerias libreria incluidas importar hacer crear como comando clases bibliotecas biblioteca python namespaces

modulos - ¿Para qué sirve la variable de nivel de módulo Python__all__?



lista de modulos de python (3)

Esta pregunta ya tiene una respuesta aquí:

Lo he visto mucho en el código fuente de Python / Lib, pero no sé para qué sirve.

Pensé que se usaba para limitar miembros accesibles de un módulo. Así que solo los elementos en __all__ aparecerán cuando dir(module) .

Hice un pequeño ejemplo y vi que no funcionaba como esperaba.

Entonces ... ¿Para qué __all__ variable de nivel de módulo Python __all__ ?



Tiene dos propósitos:

  1. Cualquiera que lea la fuente sabrá qué es la API pública expuesta. No evita que hurguen en declaraciones privadas, pero proporciona una buena advertencia para no hacerlo.

  2. Cuando se usa from mod import * , solo se from mod import * nombres listados en __all__ . Esto no es tan importante, en mi opinión, porque importar todo es realmente una mala idea.


http://docs.python.org/tutorial/modules.html#importing-from-a-package

Ahora, ¿qué sucede cuando el usuario escribe from sound.effects import * ? Idealmente, uno esperaría que esto de alguna manera salga al sistema de archivos, encuentre qué submódulos están presentes en el paquete y los importe a todos. Esto puede llevar mucho tiempo y la importación de submódulos puede tener efectos secundarios no deseados que solo deberían ocurrir cuando el submódulo se importa explícitamente.

La única solución es que el autor del paquete proporcione un índice explícito del paquete. La declaración de importación utiliza la siguiente convención: si el código __init__.py un paquete define una lista llamada __all__ , se considera la lista de nombres de módulos que deben importarse cuando se encuentra from package import * . Depende del autor del paquete mantener esta lista actualizada cuando se lance una nueva versión del paquete. Los autores de paquetes también pueden decidir no admitirlo, si no ven un uso para importar * de su paquete.