¿ __init__.py
Para 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 datetime
sin error. ¡Eso es bueno desde la versión 2.3!builtins
enumera 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__.py
se usan para marcar directorios en el disco como directorios de paquetes Python. Si tienes los archivosy
mydir
está en su camino, puede importar el códigomodule.py
comoo
Si elimina el
__init__.py
archivo, Python ya no buscará submódulos dentro de ese directorio, por lo que los intentos de importar el módulo fallarán.El
__init__.py
archivo 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__.py
se 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.py
y usafind_packages()
, es necesario tenerlo__init__.py
en cada directorio. Ver stackoverflow.com/a/56277323/7127824Además de etiquetar un directorio como un paquete de Python y definirlo
__all__
, le__init__.py
permite 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
sessionmaker
llamadoSession
para interactuar con mi base de datos. Escribí un paquete de "base de datos" con algunos módulos:Mi
__init__.py
contiene el siguiente código:Como lo defino
Session
aquí, 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
Session
en 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__.py
aquí: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__.py
archivos deben ser muy delgados para evitar violar la filosofía "explícito es mejor que implícito".fuente
engine
,sessionmaker
,create_engine
, Yos
todos pueden también ser importados dedatabase
ahora ... 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__.py
Por 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__.py
puede ser útil a veces, pero no siempre.El
__init__.py
archivo 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__.py
ya 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__.py
en un paquete. Explicaré el__init__.py
archivo con el siguiente ejemplo:__init__.py
puede estar vacío, siempre que exista. Indica que el directorio debe considerarse como un paquete. Por supuesto,__init__.py
tambié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__.py
en subPackage_b así:Despues de correr:
Por lo tanto, usando * importing, el paquete del módulo está sujeto a
__init__.py
contenido.fuente
from package_x.subPackage_b.module_n1 import function_X
Aunque Python funciona sin un
__init__.py
archivo, 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__.py
archivo:Imagine que tiene la siguiente estructura de archivos:
Y
methods.py
contenía esto:Para usarlo
foo()
necesitaría uno de los siguientes:Tal vez allí necesite (o desee) mantenerse
methods.py
dentromain_methods
(tiempos de ejecución / dependencias, por ejemplo), pero solo desea importarmain_methods
.Si cambiaste el nombre de
methods.py
a__init__.py
, podrías usarlofoo()
simplemente importandomain_methods
:Esto funciona porque
__init__.py
se trata como parte del paquete.Algunos paquetes de Python realmente hacen esto. Un ejemplo es con JSON , donde ejecutar
import json
es importar__init__.py
desde eljson
paquete ( vea la estructura del archivo del paquete aquí ):fuente
__init__.py
tratará 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__.py
dentro 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__.py
archivo facilita las importaciones. Cuando un__init__.py
está presente dentro de un paquete, la funcióna()
se puede importar desde un archivo de estab.py
manera:Sin él, sin embargo, no puede importar directamente. Tienes que modificar la ruta del sistema:
fuente