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