Рационализация структуры пакета в python

#python #packaging

#python #упаковка

Вопрос:

Я разрабатываю библиотеку Python со следующей структурой

 /application
  /lib
  __init__.py
    /models
    __init__.py
    model1.py
    model2.py
    model3.py
  

В каждой модели%.в файле py есть соответствующий класс с именем Model%. Мне нравится хранить эти классы в их собственных файлах, но это означает, что в моем приложении мне нужно импортировать классы из пакета models следующим образом

 from models.model1 import Model1
from models.model2 import Model2
from models.model3 import Model3
  

Есть ли какой-нибудь способ сделать это вместо этого?

 from models import Model1, Model2, Model3
  

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

Ранее я помещал это в мой файл / application / lib / models /_init_py

 from model1 import Model1
from model2 import Model2
from model3 import Model3
  

Но я понял, что это импортирует все классы, даже когда мне нужен только один из них

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

1. Это действительно вопрос выбора — у меня есть множество разных людей, которые говорят, что им нравится сохранять __init__.py пустым или выполнять только базовые действия по инициализации. Вы могли бы определить __all__ в __init__.py и чем, from models import *

Ответ №1:

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

Ответ №2:

Один из способов — создать файл в вашем каталоге models, который импортирует ваши классы, затем импортировать из этого файла. Например, вы могли бы создать файл с именем api.py , который содержит

 from model1 import Model1
from model2 import Model2
from model3 import Model3
  

Затем вы могли бы импортировать модели, подобные этой

 from models.api import Model1, Model2, Model3
  

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

1. Вы могли бы сделать то же самое в __init__.py

Ответ №3:

Создайте отдельный пакет для каждого модуля. Поместить model1.py в model1 пакет. В __init__.py файле model1 пакета поместите

 from model1 import Model1
  

затем вы сможете сделать

 from model1 import Model1
  

из вашего приложения.