Importaciones de Python por módulo de carpeta

Tengo una estructura de directorio:

example.py templates/ __init__.py a.py b.py 

a.py y b.py tienen solo una clase, con el mismo nombre que el archivo (porque son plantillas de guepardo). Por razones puramente de estilo, quiero poder importar y usar estas clases en example.py así:

 import templates t = templates.a() 

Ahora mismo lo hago teniendo esto en la carpeta de plantillas __init__.py :

 __all__ = ["a", "b"] from . import * 

Sin embargo, esto parece bastante pobre (y quizás superfluo), y ni siquiera hace lo que quiero, ya que tengo que usar las clases de esta manera:

 t = templates.aa() 

¿Pensamientos?

Para evitar la repetición from import * 25 veces, necesita un bucle, como:

 import sys def _allimports(modnames) thismod = sys.modules[__name__] for modname in modnames: submodname = '%s.%s' % (thismod, modname) __import__(submodname) submod = sys.modules[submodname] thismod.__dict__.update(submod.__dict__) _allimports('abcd e'.split()) # or whatever 

Pongo el código significativo en una función porque (a) siempre es mejor [[para el rendimiento y para evitar contaminar el espacio de nombres del módulo]], (b) en este caso particular, también evita accidentes (por ejemplo, algunos submódulos podrían definir un nombre thismod o modnames … así que es importante mantener esos nombres que estamos usando en el bucle local a la función, no a los módulos globales, para que no puedan ser pisoteados accidentalmente ;-).

Si desea imponer el hecho de que un módulo llamado modname solo tiene una clase (u otra global) con el mismo nombre, cambie la última statement del bucle a:

  setattr(thismod, modname, getattr(submod, modname)) 

En tu __init__.py :

 from a import * from b import * 

Ahora todos los contenidos de a estarán en templates , al igual que todos los contenidos de b .

Ni siquiera sabía que podías tener from . import * from . import * . Mi intérprete de python se queja de tales declaraciones. Aún así, para tu problema, podrías hacer:

 # __init__.py from . import a, b a = aa b = ab 

ahora puedes usar

 # example.py import templates t = templates.a() 

otra solución:

 # __init__.py from a import * from b import *