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