paquetes modulos importar python packages

python - modulos - Cómo escribo archivos buenos/correctos__init__.py



modulos python (2)

Mi paquete tiene la siguiente estructura:

mobilescouter/ __init__.py #1 mapper/ __init__.py #2 lxml/ __init__.py #3 vehiclemapper.py vehiclefeaturemapper.py vehiclefeaturesetmapper.py ... basemapper.py vehicle/ __init__.py #4 vehicle.py vehiclefeature.py vehiclefeaturemapper.py ...

No estoy seguro de cómo los archivos __init__.py deben escribirse correctamente.
El __init__.py #1 ve así:

__all__ = [''mapper'', ''vehicle''] import mapper import vehicle

Pero, ¿cómo debería ser, por ejemplo, __init__.py #2 ? El mio es:

__all__ = [''basemapper'', ''lxml''] from basemaper import * import lxml

¿Cuándo debería ser __all__ ?


Mis propios archivos __init__.py están vacíos la mayoría de las veces. En particular, nunca tengo una from blah import * como parte de __init__.py - si "importar el paquete" significa obtener todo tipo de clases, funciones, etc. definidas directamente como parte del paquete, entonces copiaré léxicamente el contenido de blah.py en el blah.py del paquete en __init__.py lugar y eliminar blah.py (la multiplicación de archivos fuente no sirve de nada aquí).

Si insiste en soportar los modismos de import * (eek), entonces usar __all__ (con una lista tan minúscula de nombres como puede tener para tenerlo) puede ayudar a controlar los daños. En general, los espacios de nombres y las importaciones explícitas son buenas cosas, ¡y es muy recomendable que reconsidere cualquier enfoque basado en omitir sistemáticamente uno o ambos conceptos!


__all__ es muy bueno: ayuda a guiar las sentencias de importación sin importar módulos automáticamente http://docs.python.org/tutorial/modules.html#importing-from-a-package

usar __all__ e import * es redundante, solo __all__ es necesario

Creo que una de las razones más poderosas para usar import * en un __init__.py para importar paquetes es poder refactorizar un script que ha crecido hasta convertirse en varios scripts sin romper una aplicación existente. Pero si estás diseñando un paquete desde el principio. Creo que es mejor dejar __init__.py archivos vacíos.

por ejemplo:

foo.py - contains classes related to foo such as fooFactory, tallFoo, shortFoo

luego la aplicación crece y ahora es una carpeta completa

foo/ __init__.py foofactories.py tallFoos.py shortfoos.py mediumfoos.py santaslittlehelperfoo.py superawsomefoo.py anotherfoo.py

entonces el script de inicio puede decir

__all__ = [''foofactories'', ''tallFoos'', ''shortfoos'', ''medumfoos'', ''santaslittlehelperfoo'', ''superawsomefoo'', ''anotherfoo''] # deprecated to keep older scripts who import this from breaking from foo.foofactories import fooFactory from foo.tallfoos import tallFoo from foo.shortfoos import shortFoo

para que una secuencia de comandos escrita para hacer lo siguiente no se rompa durante el cambio:

from foo import fooFactory, tallFoo, shortFoo