Prácticas recomendadas para importaciones en paquetes y scripts de Python 3

Considere esta estructura de carpetas simple:

root Package1 x.py y.py Package2 z.py Examples main.py 

Ahora nuestros requisitos son:

  • x.py necesita importar y.py
  • z.py necesita importar y.py
  • main.py necesita importar y.py y z.py

A continuación se muestra lo que funciona:

x.py

 import y def x(): y() 

y.py

 def y(): pass 

z.py

 import package1.y as y def z(): yy() 

main.py

 import sys from os import path sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) ) import package1.y as y import package2.z as z yy() zz() 

Preguntas:

  1. ¿Es esta la forma mejor y recomendada de configurar las importaciones en Python 3?
  2. Realmente no me gusta cambiar sys.path en main porque enlaza fuertemente las suposiciones acerca de las ubicaciones de los paquetes dentro del archivo de código. ¿Hay alguna manera de evitar eso?
  3. Tampoco me gusta lo superfluo as y parte en el import package1.y as y . ¿Hay alguna manera de evitar eso?

Como siempre, hay dos pasos separados:

  1. Usted escribe el código en el espacio de nombres abstracto de los paquetes, que contiene package1 y package2 (y sys , os , etc. ), pero no los “Ejemplos” que no son paquetes (porque main.py no es un módulo).
  2. Establece sys.path adecuada antes de que se sys.path cualquiera de tus códigos. Si se trata de su propio código (desinstalado), hay lugares donde puede ponerlo o puede escribir un contenedor de shell shell fácil de configurar para establecer PYTHONPATH para su proceso de python .

Así que las respuestas a tus preguntas son

  1. En x.py escribes from . import y from . import y . (Python 2 admite esto y 3 lo requiere).
  2. La forma de configurar sys.path depende de su sistema de empaquetado / entorno. La forma tradicional es establecer la variable de entorno PYTHONPATH para el proceso de python , pero hay otras formas que involucran cosas como el módulo del site .
  3. from package1 import y es la forma habitual de nombrar las cosas una sola vez.