¿ __init__.pyPara qué sirve un directorio fuente de Python?
python
module
package
python-packaging
Estera
fuente
fuente

Respuestas:
Solía ser una parte requerida de un paquete ( antiguo "paquete regular" anterior a 3.3 , no más nuevo 3.3+ "paquete de espacio de nombres" ).
Aquí está la documentación.
Pero solo haga clic en el enlace, contiene un ejemplo, más información y una explicación de los paquetes de espacios de nombres, el tipo de paquetes sin ellos
__init__.py.fuente
sys.path.insert(0, '/path/to/datetime'), reemplazando esa ruta con la ruta al directorio que acaba de crear. Ahora intenta algo comofrom datetime import datetime;datetime.now(). Debería obtener un AttributeError (porque ahora está importando su archivo en blanco). Si repitiera estos pasos sin crear el archivo de inicio en blanco, esto no sucedería. Eso es lo que se pretende prevenir.from datetime import datetimesin error. ¡Eso es bueno desde la versión 2.3!builtinsenumera funciones y clases integradas, no módulos integrados (cf. docs.python.org/3/tutorial/modules.html#the-dir-function ). Si desea enumerar los módulos integrados , hagaimport sys; print(sys.builtin_module_names)(cf. docs.python.org/3/library/sys.html#sys.builtin_module_names ).Los archivos nombrados
__init__.pyse usan para marcar directorios en el disco como directorios de paquetes Python. Si tienes los archivosy
mydirestá en su camino, puede importar el códigomodule.pycomoo
Si elimina el
__init__.pyarchivo, Python ya no buscará submódulos dentro de ese directorio, por lo que los intentos de importar el módulo fallarán.El
__init__.pyarchivo generalmente está vacío, pero se puede usar para exportar partes seleccionadas del paquete con un nombre más conveniente, mantener funciones convenientes, etc. Dado el ejemplo anterior, se puede acceder al contenido del módulo init comobasado en esto
fuente
__init__.pyse requería en Python 2.X y todavía se requiere en Python 2.7.12 (lo probé) pero ya no se requiere (supuestamente) en Python 3.3 en adelante, y no se requiere en Python 3.4.3 (I probado) Consulte stackoverflow.com/questions/37139786 para más detalles.__init__.py.setup.pyy usafind_packages(), es necesario tenerlo__init__.pyen cada directorio. Ver stackoverflow.com/a/56277323/7127824Además de etiquetar un directorio como un paquete de Python y definirlo
__all__, le__init__.pypermite definir cualquier variable a nivel de paquete. Hacerlo suele ser conveniente si un paquete define algo que se importará con frecuencia, de forma similar a la API. Este patrón promueve la adhesión a la filosofía pitónica "plano es mejor que anidado".Un ejemplo
Aquí hay un ejemplo de uno de mis proyectos, en el que frecuentemente importo un
sessionmakerllamadoSessionpara interactuar con mi base de datos. Escribí un paquete de "base de datos" con algunos módulos:Mi
__init__.pycontiene el siguiente código:Como lo defino
Sessionaquí, puedo comenzar una nueva sesión usando la sintaxis a continuación. Este código sería el mismo ejecutado desde dentro o fuera del directorio del paquete "base de datos".Por supuesto, esto es una pequeña conveniencia: la alternativa sería definir
Sessionen un nuevo archivo como "create_session.py" en mi paquete de base de datos, y comenzar nuevas sesiones usando:Otras lecturas
Hay un hilo de reddit bastante interesante que cubre los usos apropiados de
__init__.pyaquí:http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/
La opinión mayoritaria parece ser que los
__init__.pyarchivos deben ser muy delgados para evitar violar la filosofía "explícito es mejor que implícito".fuente
engine,sessionmaker,create_engine, Yostodos pueden también ser importados dedatabaseahora ... parece que usted ha hecho un lío de ese espacio de nombres.__all__ = [...]para limitar lo que se importa conimport *. Pero aparte de eso, sí, te queda un espacio de nombres de alto nivel desordenado.Hay 2 razones principales para
__init__.pyPor conveniencia: los otros usuarios no necesitarán conocer la ubicación exacta de sus funciones en la jerarquía de su paquete.
entonces otros pueden llamar a add () por
sin saber file1, como
Si quieres que algo se inicialice; por ejemplo, el registro (que debe colocarse en el nivel superior):
fuente
__init__.pypuede ser útil a veces, pero no siempre.El
__init__.pyarchivo hace que Python trate los directorios que lo contienen como módulos.Además, este es el primer archivo que se carga en un módulo, por lo que puede usarlo para ejecutar el código que desea ejecutar cada vez que se carga un módulo, o especificar los submódulos que se exportarán.
fuente
Desde Python 3.3,
__init__.pyya no es necesario definir directorios como paquetes Python importables.Consulte PEP 420: Paquetes de espacio de nombres implícitos :
Aquí está la prueba:
referencias:
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
https://www.python.org/dev/peps/pep-0420/
Is __init__. ¿Py no se requiere para paquetes en Python 3?
fuente
En Python la definición de paquete es muy simple. Al igual que Java, la estructura jerárquica y la estructura de directorios son las mismas. Pero tienes que tenerlo
__init__.pyen un paquete. Explicaré el__init__.pyarchivo con el siguiente ejemplo:__init__.pypuede estar vacío, siempre que exista. Indica que el directorio debe considerarse como un paquete. Por supuesto,__init__.pytambién puede establecer el contenido apropiado.Si agregamos una función en module_n1:
Despues de correr:
Luego seguimos el paquete de jerarquía y llamamos a module_n1 la función. Podemos usar
__init__.pyen subPackage_b así:Despues de correr:
Por lo tanto, usando * importing, el paquete del módulo está sujeto a
__init__.pycontenido.fuente
from package_x.subPackage_b.module_n1 import function_XAunque Python funciona sin un
__init__.pyarchivo, aún debe incluir uno.Especifica que un paquete debe tratarse como un módulo, por lo tanto, inclúyalo (incluso si está vacío).
También hay un caso en el que realmente puedes usar un
__init__.pyarchivo:Imagine que tiene la siguiente estructura de archivos:
Y
methods.pycontenía esto:Para usarlo
foo()necesitaría uno de los siguientes:Tal vez allí necesite (o desee) mantenerse
methods.pydentromain_methods(tiempos de ejecución / dependencias, por ejemplo), pero solo desea importarmain_methods.Si cambiaste el nombre de
methods.pya__init__.py, podrías usarlofoo()simplemente importandomain_methods:Esto funciona porque
__init__.pyse trata como parte del paquete.Algunos paquetes de Python realmente hacen esto. Un ejemplo es con JSON , donde ejecutar
import jsones importar__init__.pydesde eljsonpaquete ( vea la estructura del archivo del paquete aquí ):fuente
__init__.pytratará el directorio en el que se encuentra como un módulo cargable.Para las personas que prefieren leer el código, pongo el comentario de Two-Bit Alchemist aquí.
fuente
Facilita la importación de otros archivos de Python. Cuando colocaste este archivo en un directorio (digamos cosas) que contiene otros archivos py, entonces puedes hacer algo como importar cosas.otras.
Sin esto
__init__.pydentro del directorio, no podría importar other.py, porque Python no sabe dónde está el código fuente de las cosas y no puede reconocerlo como un paquete.fuente
Un
__init__.pyarchivo facilita las importaciones. Cuando un__init__.pyestá presente dentro de un paquete, la funcióna()se puede importar desde un archivo de estab.pymanera:Sin él, sin embargo, no puede importar directamente. Tienes que modificar la ruta del sistema:
fuente