Зачем передавать строку, представляющую объект, вместо передачи объекта?

#python #django #object

#python #django #объект

Вопрос:

Приведенный ниже код взят из Django ‘s settings.py . Поскольку все в Python является объектом, почему бы просто не передать установленные приложения как кортеж объектов:

 INSTALLED_APPS = (
  django.contrib.auth,
  django.contrib.contenttypes,
.....
  

Есть ли какая-то веская причина, по которой они это делают:

 INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
.....
  

вместо этого?

Я новичок в Python и Django , так что не судите меня слишком строго, пожалуйста.

Ответ №1:

Передача имени модуля или класса в виде строки является типичным решением для избежания циклической ошибки импорта.
Например, если файл настроек содержит import myapp.models и myapp.models содержит from django.conf import settings , это приведет к циклическому импорту.

Комментарии:

1. Отлично. Это все объясняет

Ответ №2:

Сначала вам придется import django и так заставить это работать, иначе у вас будет ошибка.

Комментарии:

1. Итак, это Django настройки. Почему не выполняется импорт django ? Эти модули / библиотеки / классы / что угодно будут загружены в любом случае, верно?

2. Потому что это проще для чтения и короче — если у вас длинный список установленных приложений, вам придется импортировать много модулей. Я не пробовал это, но это должно сработать, если Django внутренне способен работать с объектами в INSTALLED_APPS.

3. Например, в MIDDLEWARE_CLASSES есть что-то вроде этого: ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', 'debug_toolbar.middleware.DebugToolbarMiddleware' ) — Как вы себе представляете такое количество импорта?

4. Как это легче читать? 'django.contrib.something' vs django.contrib.something ? Второе для меня проще.

5. Тогда импортировать модуль и включать его не СУХО .