Python import all from folder

Я столкнулся с проблемой во время работы над своим проектом Django. У меня есть несколько классов в файле views.py. В нем было 1200 строк, поэтому я решил перенести эти представления в отдельные файлы в новой папке. Теперь один файл, например, Customer.py имеет 2 класса для различных операций.

Вот структура моего проекта до разделения views.py:

MyProject
  core
    -  urls.py
  api
    -  views.py
  manage.py

Структура проекта после разделения views.py

MyProject
  core
    -  urls.py
  api
    -  view
        -   *all the files with multiple classes in each file*
  manage.py

После разделения views.py мне понадобилось импортировать все классы из всех файлов внутри папки view в core/urls.py. Я уже несколько часов пытаюсь это выяснить и могу понять...

Мое текущее решение заключается в том, что в urls.py я делаю

from api.view import * 

при наличии init.py внутри папки view, который делает

from .oneOfManyClasses import *

для всех классов...

Мне очень не нравится это решение, я бы хотел найти какое-нибудь хорошее простое элегантное решение. Есть ли здесь кто-нибудь, кто может мне помочь?

Большая благодарность

Избегание явного импорта

Вы не можете избежать этого, по крайней мере, без нарушения завершения кода в IDE.

import importlib
import os

filedir = os.path.dirname(__file__)
modules = [f[:-3] for f in os.listdir(filedir) if os.path.isfile(os.path.join(filedir, f)) and f.endswith('.py') and f != '__init__.py']
for module_name in modules:
    module = importlib.import_module(f".{module_name}", package=__name__)
    names = [x for x in module.__dict__ if not x.startswith("_")]
    globals().update({name: getattr(module, name) for name in names})

Я бы не считал это красивым, простым или элегантным.

Самозамещение сгенерированных импортов

Если вас беспокоит необходимость делать это вручную, то, вероятно, лучшее, что вы можете сделать, это написать скрипт, который будет генерировать утверждения импорта и заменять себя при запуске.

import os

filedir = os.path.dirname(__file__)
modules = [f[:-3] for f in os.listdir(filedir) if os.path.isfile(os.path.join(filedir, f)) and f.endswith('.py') and f != '__init__.py']
imports = [f"    from .{module} import *\n" for module in sorted(modules)]

with open(__file__, 'r') as f:
    this_script = list(f)[:17]

with open(__file__, 'w') as f:
    f.write(f"""{''.join(this_script)[:-1]}
try:
{''.join(imports)[:-1] if imports else '    pass'}
except ImportError:
    pass
""")

try:
    from .oneOfManyFiles import *
except ImportError:
    pass

Для завершения кода либо запустите проект, либо python -m api.view.__init__.

Вернуться на верх