2008-09-29 7 views

Répondre

30

Veuillez reconsidérer. La seule chose pire que import * est magieimport *.

Si vous voulez vraiment:

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

peut-être mieux: pour attr en m .__ all__ ? –

+0

@Sergei: il n'y a aucune garantie que les modules vont définir __all__ –

+1

@John Millikin: Mais si un module définit __all__, vous devez l'observer –

0

Le problème sous-jacent est que je développe un certain Django, mais plus d'un hôte (avec des collègues), tous avec des paramètres différents. J'espérais faire quelque chose comme ça dans le fichier de projet/settings.py:

from platform import node 

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

__import__(settings_files[ node() ]) 

Il semblait une solution simple (donc élégante), mais je suis d'accord qu'il a une odeur et la simplicité se éteint la boucle quand vous devez utiliser la logique comme ce que John Millikin a posté (merci). Voici essentiellement la solution que je suis allé avec:

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()) 

Qui fonctionne bien pour nos besoins.

-2

Je n'ai pas trouvé une bonne façon de le faire donc je pris une plus simple, mais laide de façon 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

Je peux voir d'où vient ce code, mais cet appel à exec me fait froid dans le dos. Je ne sais pas vraiment si c'est un gros problème dans ce cas, mais j'ai appris à faire confiance à mes instincts à propos de choses comme ça. –

+0

Ceci est illégal à l'intérieur de la fonction, et a l'air terrible en effet. –

1

Il semble que vous pouvez également utiliser dict.update() sur les dictionnaires du module dans votre cas:

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

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

Mise à jour: Je pense qu'il ya une version courte "fonctionnelle" de celui-ci:

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

La réponse de ilya n'est pas valide, ou pourquoi at-il été abattu? – akaihola

5

Voici ma solution pour la dénomination dynamique des fichiers de paramètres locaux pour Django. Notez l'addition ci-dessous d'une vérification pour ne pas inclure les attributs contenant '__' du fichier importé. Le __name__ global a été remplacé par le nom de module du fichier de paramètres local, ce qui a causé setup_environ(), utilisé dans manage.py, d'avoir des problèmes.

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) 
Questions connexes