Importar constantes segun condicion
Chema Cortes
pych3m4 en gmail.com
Jue Feb 8 18:56:51 CET 2007
El 8/02/07, Alejandro Novo <alejandro.novo en gmail.com> escribió:
> La manera "guarra" que he usado ha sido ... http://pastebin.com/878200 (aquí
> se ve más claro)
>
> try:
> > if GUEST == 'Local':
> > import ImportLocal
> > pattern = re.compile('\A__*')
> > l = dir(ImportLocal)
> > for elem in l:
> > if not pattern.search(elem):
> > print 'Voy a importar ... ', elem
> > s = 'from ImportLocal import %s' % elem
> > exec s
> > else:
> > import ImportRemote
> > pattern = re.compile('\A__*')
> > l = dir(ImportRemote)
> > for elem in l:
> > if not pattern.search(elem):
> > print 'Voy a importar ... ', elem
> > s = 'from ImportRemote import %s' % elem
> > exec s
> > except:
> > 'No existe!
> >
> ¿se os ocurre otra manera mas elegante de hacerlo? necesito que se pueda
> hacer tanto "Import xxx" como "from xxx import y".
No sé lo que pretendes hacer, pero, sea lo que sea, lo estás
complicando bastante.
Lo primero: no necesitas expresiones regulares para chequear el inicio
de una cadena de texto. Mejor emplea .startswith().
Luego, lo de "from...import..." : parece que lo que pretendes es
copiar el espacio de nombres de un módulo en éste. Creo que podrías
evitarlo si sigues las instrucciones de creación de paquetes. Por
ejemplo, " from...import * " haría lo mismo que pretendes hacer ya
que no importa aquellos objetos que empiecen por subrayado.
Aún así, te pongo una alternativa siguiendo el mismo método que hacía tu código:
if GUEST == 'Local':
import ImportLocal as mimodulo
else:
import ImportRemote as mimodulo
it_importado=vars(mimodulo).iteritems()
elementos=((k,v) for (k,v) in it_importado if not k.startswith("__"))
globals().update( dict(elementos) )
Más información sobre la lista de distribución Python-es