2008-09-29 12 views

Respuesta

30

Por favor reconsidere. Lo único peor que import * es magicimport *.

Si realmente quiere:

m = __import__ (S) 
try: 
    attrlist = m.__all__ 
except AttributeError: 
    attrlist = dir (m) 
for attr in attrlist: 
    globals()[attr] = getattr (m, attr) 
+0

quizás mejor: para attr en m .__ all__ ? –

+0

@Sergei: no hay garantía de que los módulos definan __all__ –

+1

@John Millikin: Pero si un módulo define __all__ debe observarlo –

0

El problema de fondo es que estoy desarrollando algunos de Django, pero en más de un host (con colegas), todos ellos con diferentes configuraciones. Tenía la esperanza de hacer algo como esto en el archivo de proyecto/settings.py:

from platform import node 

settings_files = { 'BMH.lan': 'settings_bmh.py", ... } 

__import__(settings_files[ node() ]) 

ha parecido una solución simple (por lo tanto elegante), pero estoy de acuerdo que tiene un olor a ella y la sencillez va fuera el ciclo cuando tienes que usar la lógica como lo que publicó John Millikin (gracias). Aquí está esencialmente la solución que fui con:

from platform import node 

from settings_global import * 

n = node() 

if n == 'BMH.lan': 
    from settings_bmh import * 
# add your own, here... 
else: 
    raise Exception("No host settings for '%s'. See settings.py." % node()) 

Lo que funciona bien para nuestros propósitos.

-2

no he encontrado una buena manera de hacerlo así que tomó una forma más sencilla, pero feo desde http://www.djangosnippets.org/snippets/600/

try: 
    import socket 
    hostname = socket.gethostname().replace('.','_') 
    exec "from host_settings.%s import *" % hostname 
except ImportError, e: 
    raise e 
+3

Puedo ver de dónde viene este código, pero esa llamada al ejecutivo me envía escalofríos. Realmente no sé si es un gran problema en este caso, pero he aprendido a confiar en mis instintos sobre cosas como esta. –

+0

Esto es ilegal dentro de la función, y se ve terrible de hecho. –

1

Parece que también se puede utilizar dict.update() en los diccionarios del módulo de su caso:

config = [__import__(name) for name in names_list] 

options = {} 
for conf in config: 
    options.update(conf.__dict__) 

actualización: Creo que hay una versión corta "funcional" de la misma:

options = reduce(dict.update, map(__import__, names_list)) 
+0

¿La respuesta de ilya es inválida, o por qué ha sido downvoted? – akaihola

5

Aquí está mi solución para nombrar dinámicamente los archivos de configuración local para Django. Tenga en cuenta la adición debajo de un cheque para no incluir atributos que contengan '__' del archivo importado. El archivo global __name__ se sobrescribió con el nombre del módulo del archivo de configuración local, lo que provocó que setup_environ(), utilizado en manage.py, tuviera problemas.

try: 
    import socket 
    HOSTNAME = socket.gethostname().replace('.','_') 
    # See http://docs.python.org/library/functions.html#__import__ 
    m = __import__(name="settings_%s" % HOSTNAME, globals=globals(), locals=locals(), fromlist="*") 
    try: 
     attrlist = m.__all__ 
    except AttributeError: 
     attrlist = dir(m)   
    for attr in [a for a in attrlist if '__' not in a]: 
     globals()[attr] = getattr(m, attr) 

except ImportError, e: 
    sys.stderr.write('Unable to read settings_%s.py\n' % HOSTNAME) 
    sys.exit(1) 
Cuestiones relacionadas