Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Пересмотрите. Единственная вещь, хуже, чем import *
, волшебство import *
.
, Если Вы действительно хотите:
m = __import__ (S)
try:
attrlist = m.__all__
except AttributeError:
attrlist = dir (m)
for attr in attrlist:
globals()[attr] = getattr (m, attr)
Базовая проблема состоит в том, что я разрабатываю некоторого 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
Похоже, что вы также можете использовать 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. Обратите внимание на добавленную ниже проверку, чтобы не включать атрибуты, содержащие '__', из импортированного файла. Глобальная переменная __ 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)