python - español - django tutorial
No se requiere__init__.py para los paquetes en Python 3.3+ (4)
Estoy usando Python 3.5.1. Leí el documento y la sección del paquete aquí: https://docs.python.org/3/tutorial/modules.html#packages
Ahora, tengo la siguiente estructura:
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print(''initializing Foo'')
Ahora, mientras
/home/wujek/Playground
en
/home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Del mismo modo, ahora en casa, supercarpeta de
Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
En realidad, puedo hacer todo tipo de cosas:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
¿Por qué funciona esto?
Pensé que tenía que haber archivos
__init__.py
(los vacíos funcionarían) en
a
y
b
para que
module.py
sea importante cuando la ruta de Python apunta a la carpeta
Playground
.
Esto parece haber cambiado desde Python 2.7:
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
Con
__init__.py
en
~/Playground/a
y
~/Playground/a/b
funciona bien.
Python 3.3+ tiene
paquetes de espacio de nombres implícitos
que le permiten crear paquetes sin un archivo
__init__.py
.
Permitir paquetes de espacio de nombres implícitos significa que el requisito de proporcionar un archivo
__init__.py
puede eliminarse por completo y verse afectado ....
La forma antigua con los archivos
__init__.py
todavía funciona como en Python 2.
Yo diría que uno debe omitir
__init__.py
solo si quiere tener el
paquete de espacio de nombres implícito
.
Si no sabe lo que significa, probablemente no lo quiera y, por lo tanto, debe continuar usando
__init__.py
incluso en Python 3.
si tiene
setup.py
y usa
find_packages()
es necesario tener
__init__.py
en cada directorio para que los paquetes se encuentren automáticamente
Los paquetes solo se reconocen si incluyen un archivo
__init__.py
IMPORTANTE
La respuesta de @ Mike es correcta pero demasiado imprecisa.
Es cierto que Python 3.3+ admite
paquetes de espacio de nombres implícitos
que le permite crear un paquete sin un archivo
__init__.py
.
Sin embargo, esto SOLO se aplica a los archivos
__init__.py
.
Por lo
__init__.py
archivos
__init__.py
ya no son necesarios y pueden omitirse.
Si desea ejecutar un script de inicialización particular cuando se importa el paquete o cualquiera de sus módulos o
__init__.py
, aún necesita un archivo
__init__.py
.
Esta es una gran
respuesta
de
para
__init__.py
por qué desea utilizar un archivo
__init__.py
para realizar una inicialización adicional en caso de que se pregunte por qué esto es de alguna manera útil.
Ejemplo de estructura de directorio:
parent_package/
__init__.py <- EMPTY, NOT NECESSARY in Python 3.3+
child_package/
__init__.py <- STILL REQUIRED if you want to run an initialization script
child1.py
child2.py
child3.py
parent_package/child_package/__init__.py
:
print("from parent")
EJEMPLOS
Los siguientes ejemplos demuestran cómo se ejecuta el script de inicialización cuando se
child_package
el
child_package
o uno de sus módulos.
Ejemplo 1 :
from parent_package import child_package # prints "from parent"
Ejemplo 2
from parent_package.child_package import child1 # prints "from parent"