Управление импортом всех модулей в одном файле в проекте Python/Django, избегая циклического импорта
Я работаю над проектом Django, в котором есть множество импортируемых модулей в различных файлах, иногда до 50 строк импортов на страницу. Чтобы уменьшить беспорядок, я создал единый файл "imports.py", чтобы централизовать мои импорты.
Вот краткий пример того, как это выглядит:
from datetime import date, datetime
from typing import Any, Callable, Optional, Final, Type, TypeAlias, cast, Iterable
from functools import wraps
from cryptography.fernet import Fernet
from requests.auth import HTTPBasicAuth
from requests.models import Response
from PIL import Image, UnidentifiedImageError
from smtplib import SMTPRecipientsRefused
from dotenv import load_dotenv
from django.db import models, IntegrityError
...
# a lot more
__all__ = [
'datetime', 'Any',
'Callable', 'Optional', 'Final', 'Type', 'TypeAlias', 'cast', 'Iterable', 'wraps',
'Fernet', 'HTTPBasicAuth', 'Response', 'Image', 'UnidentifiedImageError',
'SMTPRecipientsRefused', 'load_dotenv', 'models', 'IntegrityError',......]
Затем, в других файлах, я импортирую все из imports.py следующим образом:
from bi_app.py.imports import *
Хотя я знаю, что это может быть нетрадиционно, я нахожу это более организованным. Этот метод хорошо работает для внешних модулей, а также для Linters, но когда я пытаюсь включить импорт для собственных файлов проекта, я часто сталкиваюсь с проблемой кругового импорта.
Мой вопрос заключается в следующем: есть ли способ объединить все импорты из моих собственных файлов в один файл, не вызывая циклического импорта? Спасибо за помощь
Я думаю, чтобы приспособить такой подход к импорту, вам придется тщательно продумать всю структуру вашего проекта. Например, если бы у вас было (скажем) 10 модулей, где 7 из них - независимые модули нижнего уровня, не требующие импорта вообще, а остальные 3 требуют импорта только этих 7 модулей нижнего уровня, но не требуют импорта друг от друга. Что довольно сложно в Django, учитывая все взаимодействия, необходимые между вашими models.py
, urls.py
и views.py
... каждый из них опирается на элементы других.
Я понимаю привлекательность такого подхода, но его реализация в большом и сложном проекте может потребовать больше усилий, чем того стоит. Лучше всего будет ограничить "модуль-импортер" теми элементами, которые вы упомянули и которые не наступают друг на друга (внешние модули и т. д.), а затем использовать более традиционный подход для любых модулей, импортируемых из вашего собственного проекта. Вы все равно получите преимущество в том, что большинство(?) из этого очень длинного списка импортов будет собрано в одном месте.