2008-09-29 18 views

回答

30

请重新考虑。唯一比import *更差的是魔术import *

如果你真的想:

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

也许更好: 为以米.__ all__ ATTR? – 2008-09-29 04:47:34

+0

@Sergei:不能保证模块会定义__all__ – 2008-09-29 04:55:13

+1

@John Millikin:但是如果一个模块定义__all__,你应该遵守它 – 2008-09-29 06:56:50

0

根本的问题是,我开发一些Django的,但超过一台主机(与同事),都具有不同的设置上。我希望做这样的事情在工程/ settings.py文件:

from platform import node 

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

__import__(settings_files[ node() ]) 

这似乎是一个简单的解决方案(从而优雅),但我会同意,它有一个气味,并简单熄灭当你必须使用John Millikin所发布的逻辑时,循环(谢谢)。这里基本上是我去的解决方案:

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

这对我们的目的正常工作。

-2

我没有找到一个很好的办法做到这一点,所以我花了一个简单,但丑陋的方式从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 
1

看来,你也可以在使用dict.update()在模块的字典你的情况:

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

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

更新:我觉得有一个短暂的 “功能性” 的版本是:

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

这是我为Django的本地设置文件动态命名的解决方案。请注意,检查下面的添加内容不包含导入文件中包含“__”的属性。全局变量__name__被本地设置文件的模块名称覆盖,导致manage.py中使用setup_environ()有问题。

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) 
相关问题