tutorial español python python-3.x package

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

Docs


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"