Python - импорт классов пакета в консольное глобальное пространство имен

Позвольте мне отвечать на свой собственный вопрос. Базовая проблема здесь состоит в том, что settings.py импортируется дважды, или возможно еще больше (См. здесь ). (Я все еще не понимаю, почему это. Возможно, некоторый эксперт Django мог объяснить это мне.) Это, кажется, верно для некоторых других модулей также. В этой точке я не думаю, что мудро сделать предположения о том, сколько раз settings.py будет импортировано. В этом отношении такие предположения не безопасны в целом. У меня был этот код в местах кроме settings.py, и результаты подобны.

необходимо кодировать вокруг этого. Таким образом, необходимо проверить регистратор на существующие обработчики прежде, чем добавить дополнительные обработчики к нему. Это немного ужасно, потому что совершенно разумно иметь несколько обработчиков - даже того же типа - подключенный к одному регистратору. Существует несколько решений контакта с этим. Каждый - проверка свойство обработчиков Вашего объекта регистратора. Если Вы только хотите один обработчик и Вашу длину> 0, то не добавляйте его. Лично я не люблю это решение, потому что это становится грязным с большим количеством обработчиков.

я предпочитаю что-то вроде этого (благодаря Thomas Guettler):

# file logconfig.py
if not hasattr(logging, "set_up_done"):
    logging.set_up_done=False

def set_up(myhome):
    if logging.set_up_done:
        return
    # set up your logging here
    # ...
    logging.set_up_done=True

я должен сказать, я желаю того, что Django импортирует settings.py, многократно были лучше зарегистрированы. И я предположил бы, что моя конфигурация является так или иначе причиной это, несколько импортируют, но я испытываю затруднения при обнаружении того, что вызывает проблему и почему. Возможно, я просто не мог найти, что в их документах, но буду думать, что это - вид вещи, о которой необходимо предупредить пользователей.

10
задан Fish 16 October 2013 в 15:59
поделиться

1 ответ

Вы хотите использовать другую форму импорта.

В имя проекта / main_stuff / __ init __. Py :

from other_stuff import *
__all__ = ["main1", "main2", "main3"]

Когда вы используете такой оператор, как это:

import foo

Вы определяете имя foo в текущем модуле. Затем вы можете использовать foo.

19
ответ дан 3 December 2019 в 20:05
поделиться
Другие вопросы по тегам:

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