2009-12-01 13 views
5

Suponga que tiene la siguiente¿Importación propia de subpaquetes o no?

b 
b/__init__.py 
b/c 
b/c/__init__.py 
b/c/d 
b/c/d/__init__.py 

En algunos paquetes de Python, si import b, que sólo recibe los símbolos definidos en b. Para acceder a b.c, tiene que explícitamente import b.c o from b import c. En otras palabras, tiene que

import b 
import b.c 
import b.c.d 
print b.c.d 

En otros casos, vi una importación automática de todos los subpaquetes. Esto significa que el siguiente código no produce un error

import b 
print b.c.d 

porque b/__init__.py se encarga de la importación de sus sub-paquetes. Tiendo a preferir el primero (explícito mejor que implícito), y siempre lo utilicé, pero ¿hay casos en que el segundo es preferible al primero?

Respuesta

5

Me gustan los espacios de nombres, así que creo que import b solo debe obtener lo que está en b (presumiblemente en b/__init__.py). Si hay una razón para segregar otras funcionalidades en b.c, b.c.d, o lo que sea, entonces solo import b no debería arrastrarlo todo; si el "arrastrarlo todo" sucede, creo que eso sugiere que la separación del espacio de nombres fue probablemente una falsa uno para empezar Por supuesto, hay ejemplos incluso en la biblioteca estándar (import os, luego puede usar os.path.join y similares), pero son antiguos, en este momento esencialmente cosas "protegidas" antes de que el sistema de empaque Python fuera maduro y estable. En el nuevo código, fuertemente recomiendo que un paquete debe no arrastre sus subpaquetes durante el viaje cuando lo importe. (Haga import this en el indicador de Python y contemple la última línea que muestra ;-).

0

__all__ = [sus Vars, funciones, clases]

Uso sintaxis anterior en el paquete de b __init__.py a las cosas de carga automática que se listan en dict. :)

Cuestiones relacionadas