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í:
- ¿Alguien puede explicar __all__ en Python? 9 respuestas
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:
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.
Cuando se usa
from mod import *
, solo sefrom 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 encuentrafrom 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.