2008-09-29 87 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) 
相關問題