Вопрос

В некоторых моих приложениях Django я использую settings_local.py файл для переопределения настроек, которые различаются в разных средах (например,разработка, испытания и производство).Первоначально я использовал следующий код, чтобы включить его содержимое в файл settings.py:

try:
    from settings_local import *
except ImportError:
    sys.stderr.write("The settings_local.py file is missing.\n")
    DEBUG=False

Недавно я нашел execfile функцию и переключился на что-то вроде:

try:
    execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
    sys.stderr.write("The settings_local.py file is missing.\n"
    DEBUG=False

Оба работают так, как задумано, но мне любопытно, не упускаю ли я каких-либо ошибок и вообще какой подход более рекомендуется и почему.

Это было полезно?

Решение

С использованием execfile Функция приведет к оценке исходного файла Python (.py) каждый раз, когда оценивается файл настроек.Вы каждый раз запускаете парсер Python.С использованием import не обязательно это делать (можно использовать файл .pyc).Обычно при первом запуске проекта на Python (по крайней мере, cPython) он компилируется в байт-код и больше не компилируется.Вы нарушаете это.Это не обязательно проблема, но вы должны об этом знать.

С использованием execfile также приведет к тому, что весь импорт, который вы можете иметь в settings_local.py файл повторно оценивается в области модуля settings.py файл.С использованием import * включил бы все элементы в settings_local.py область действия модуля.Конечный эффект тот же (все элементы, включенные в settings_local.py область действия модуля включены в settings.py), но метод другой.

Наконец, вполне нормально, что модули выполняются как модули, а не включаются.Разумно включать в код такие вещи, как os.path.dirname(__file__).Если бы какой-либо код использовал это, вы бы его запутали, поскольку код больше не будет выполняться в модуле, как мог разумно ожидать автор.

По моему опыту, люди используют import нет execfile.Django во многом «соглашение важнее конфигурации».Следуйте конвенции.

Другие советы

Еще одно отличие:execfile получает контекстный словарь;Глобальный контекст по умолчанию или указанный словарь.Это может допустить некоторые странные вещи

dont_do_this.py:

# Probably not a good thing to do
z=x+1  # an expression that involves an un-defined field

Очевидно,

from dont_do_this import *

терпит неудачу.

Однако,

d={'x':1}
execfile( 'dont_do_this.py', d )

это нормально и приводит к d=={'x':1, 'z':2}

Обратите внимание, что

x=1
execfile( 'dont_do_this.py' )

в порядке и приводит к переменной z добавляется в глобальные переменные.

Первая версия(from settings_local import *) — это то, что каждый ожидает увидеть.Это также позволит анализаторам кода найти модуль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top