モジュール名の文字列が与えられた場合、次のようにモジュール内のすべてをどのようにインポートしますか?
from module import *
つまり、文字列 S="module" が与えられた場合、次の同等のものを取得するにはどうすればよいですか。
__import__(S, fromlist="*")
これは期待どおりに実行されないようです (何もインポートしないため)。
モジュール名の文字列が与えられた場合、次のようにモジュール内のすべてをどのようにインポートしますか?
from module import *
つまり、文字列 S="module" が与えられた場合、次の同等のものを取得するにはどうすればよいですか。
__import__(S, fromlist="*")
これは期待どおりに実行されないようです (何もインポートしないため)。
再考してください。魔法より悪いのimport *
は魔法 import *
だけだ。
あなたが本当にしたい場合:
m = __import__ (S)
try:
attrlist = m.__all__
except AttributeError:
attrlist = dir (m)
for attr in attrlist:
globals()[attr] = getattr (m, attr)
これが、Django のローカル設定ファイルの動的な名前付けに対する私の解決策です。インポートされたファイルから「__」を含む属性を含めないように、以下のチェックが追加されていることに注意してください。__name__
グローバルは、ローカル設定ファイルのモジュール名で上書きされていたためsetup_environ()
、manage.py で使用される に問題がありました。
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)
あなたの場合、モジュールの辞書で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))
根本的な問題は、私がいくつかの Django を開発しているが、複数のホスト (同僚と) ですべて異なる設定を使用していることです。project/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())
これは私たちの目的にはうまく機能します。
私はそれを行う良い方法を見つけられなかったので、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