Как каждый делает эквивалент “импорта * от модуля” с Python __ импорт __ функция?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

18
задан serv-inc 29 June 2017 в 15:39
поделиться

5 ответов

Пересмотрите. Единственная вещь, хуже, чем import *, волшебство import *.

, Если Вы действительно хотите:

m = __import__ (S)
try:
    attrlist = m.__all__
except AttributeError:
    attrlist = dir (m)
for attr in attrlist:
    globals()[attr] = getattr (m, attr)
34
ответ дан 30 November 2019 в 07:13
поделиться

Базовая проблема состоит в том, что я разрабатываю некоторого 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())

, Который хорошо работает в наших целях.

0
ответ дан 30 November 2019 в 07:13
поделиться

Я не нашел хороший способ сделать это так, я взял более простой, но ужасный путь от 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
ответ дан 30 November 2019 в 07:13
поделиться

Похоже, что вы также можете использовать 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))
0
ответ дан 30 November 2019 в 07:13
поделиться

Вот мое решение для динамического именования файлов локальных настроек для 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)
6
ответ дан 30 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: