2012-05-18 9 views
8

Veo un patrón común con los módulos de Python. A veces __init__.py importa sus submódulos:¿Es una buena práctica para un módulo importar de manera recursiva sus submódulos?

P. ej.

mymod/ 
    __init__.py: 
     from . import subm1, subm2 
     __all__ = ['subm1', 'subm2'] 

    subm1.py: 
     def subf1(): 
      ... 
     __all__ = ['subf1'] 

    subm2.py: 
     def subf2(): 
      ... 
     __all__ = ['subf2'] 

Así que el código cliente sólo tiene que hacer esto:

import mymod 
mymod.subm1.subf1() 
mymod.subm2.subf2() 

En lugar de:

import mymod.subm1 
import mymod.subm2 
mymod.subm1.subf1() 
mymod.subm2.subf2() 

¿Cuál es la mejor práctica TM? ¿Hay algún problema con la importación recursiva o debería seguir el comportamiento predeterminado? ¿Cuál es la razón del comportamiento predeterminado?

+0

Ambas son opciones de diseño válidas, pero tenga en cuenta que las importaciones recursivas provocarán que la carga del paquete sea más lenta a medida que crece en tamaño. –

Respuesta

3

Esto dependería del uso de su módulo. Si los submódulos son solo objetos individuales que son escritos como como módulos en lugar de tener, por ejemplo, clases similares a Java con métodos totalmente estáticos, la importación recursiva probablemente sea adecuada. Por otro lado, si su módulo está agrupando varios submódulos relacionados (consulte, p. Ej., El módulo stdlib html), desearía importaciones de submódulos explícitas.

En general, una instalación de importación recursiva dice "cualquier cliente de este módulo siempre querrá todos estos". Considere si eso es cierto para su módulo (y otros módulos, caso por caso), y vaya desde allí.

0

Esas prácticas son iguales.

El primer ejemplo espera que ambos submódulos se usen juntos, por lo que siempre habrá dos importaciones en el código de usuario. Les ofrecen un atajo.

El segundo que se espera que los submódulos sean bloques independientes con solo interacción indirecta con otros.

Cuestiones relacionadas