2011-11-08 20 views
5

Tengo un número creciente de scripts que componen un programa que estoy escribiendo y decidí que era hora de limpiar mi árbol fuente y empaquetarlos correctamente. Estoy seguro de que esta es una pregunta simple, pero no puedo averiguar cómo hacerlo.Paquetes "dentro" de los módulos

Si tengo un grupo de módulos, que encajen, pero uno debe ser un módulo de nivel superior y los demás deben ir precedidos por el nombre del módulo, pero en realidad van a paquetes de nivel inferior, ¿cómo puedo hacerlo?

Por ejemplo decir que quería poder import mystuff, y obtener todos los mitos. pero también debería ser capaz de import mystuff.test.test1. Pensé que iba a crear un árbol como este,

myprogram/ 
    mystuff.py 
    mystuff/ 
     __init__.py 
     tests/ 
      __init__.py 
      test1.py 
      test2.py 
      ... 

Pero en este caso, parece mystuff/ siempre tiene prioridad sobre mystuff.py, por lo import mystuff no hace nada (siempre y cuando mystuff/ 's __init__.py está vacía).

¿Cuál sería el enfoque correcto para obtener el comportamiento deseado? O esto no es posible y debo mover mystuff.py al mystuff/ y tener que acceder a él como mystuff.mystuff (parece una repetición innecesaria).

Lo siento, si me he perdido algo obvio. Supongo que esto debe documentarse en alguna parte, pero parece que no puedo encontrar dónde está.

Actualización. ¡Aunque creo que el método de Ignacio es el correcto, realmente no me gusta! Si tengo varios archivos abiertos en mi editor y todos se llaman __init__.py, las cosas podrían volverse desordenadas. Por lo tanto, he decidido dejar mi estructura tal como está, y vincular mystuff.py al mystuff/__init__.py. Si alguien tiene alguna opinión sobre por qué no debería estar haciendo esto, me gustaría escucharlos.

En realidad, al final, estoy relacionándome al revés, ya que no pude encontrar una manera de hacer enlaces simbólicos de desreferencia de distutils al crear un tar.gz, y terminé con enlaces rotos en mi salida. De esta manera tiene el mismo efecto y lo mantiene feliz.

+0

Sí. No deberías hacer eso porque la respuesta de Ignatio es la correcta. – cwallenpoole

+0

@cwallenpoole.De acuerdo, pero al final del día, la forma en que lo tengo configurado tiene * exactamente * el mismo efecto. Incluso la salida 'sdist' será exactamente igual a la de Ignacio, sin mis enlaces. Por lo tanto, me facilita el desarrollo. ¿Hay alguna otra razón por la cual esto es algo malo de hacer? – tjm

Respuesta

4

Todo en mystuff.py debe colocarse en mystuff/__init__.py en su lugar.

+0

Pensé en eso. Pero parecía una forma desagradable de hacerlo. ¿Es ese el método recomendado? Si es así, ¿eso es lo que haré, o es solo "una manera que funcionará"? Gracias por tu respuesta. – tjm

+0

Así es como se hace. Cualquier cosa en 'foo/__ init __. Py' se convertirá en parte de' foo' cuando se importe. –

+0

Ok. Eso es genial entonces. Tan fácil como eso :) Muchas gracias. (Se aceptará cuando esté permitido) – tjm

4

No puede tener un paquete mystuff.py y otro mystuff/.

tiene dos opciones:

  • poner el código en mystuff.py en mystuff/__init__.py
  • cambiar el nombre mystuff.py a, por ejemplo, mystuff/_stuff.py, y luego importar que en mystuff/__init__.py.

La segunda opción es como la siguiente:

myprogram/ 
    mystuff.py ------- 
    mystuff/   \ 
     __init__.py /
     _stuff.py <--- 
     tests/ 
      __init__.py 
      test1.py 
      test2.py 
      ... 

y mystuff/__init__.py parece:

from mystuff._stuff import * 
Cuestiones relacionadas