@Aquinary
Хинафаг.

Все точки над import или как импортировать правильно собственные модули?

Доброго времени суток!
Имеется подобная структура проекта:
myproject
    api
        product.py
        bitrix.py
        storage.py
    main.py


Каждый файл внутри папки api имеет классы-заглушки вида Product, Bitrix, Storage.

Вариант импорта 1 (нерабочий)
Импорт:
from api import *

products = Product()

Выхлоп:
Traceback (most recent call last):
  File "C:\Git\xanalyze\main.py", line 3, in <module>
    products = Product()
NameError: name 'Product' is not defined

Но если судить по stackoverflow, то это должно работать. Но увы.
Вариант импорта 2 (нерабочий)
Импорт:
from api import *

products = api.Product()

Выхлоп:
Traceback (most recent call last):
  File "C:\Git\xanalyze\main.py", line 3, in <module>
    products = api.Product()
NameError: name 'api' is not defined

Вариант импорта 3 (нерабочий)
Импорт:
import api

products = api.Product()

Выхлоп:
Traceback (most recent call last):
  File "C:\Git\xanalyze\main.py", line 3, in <module>
    products = api.Product()
AttributeError: module 'api' has no attribute 'Product'

Вариант импорта 4 (нерабочий)
Импорт:
import api

products = Product()

Выхлоп:
Traceback (most recent call last):
  File "C:\Git\xanalyze\main.py", line 3, in <module>
    products = Product()
NameError: name 'Product' is not defined

Вариант импорта 5 (рабочий)
Импорт:
from api import product, bitrix, storage

products = product.Product()

Работает.
С одним нюансом.
Добавим импорт внутри модуля:
# product.py
import bitrix

Выхлоп:
Traceback (most recent call last):
  File "C:\Git\xanalyze\main.py", line 1, in <module>
    from api import product, storage
  File "C:\Git\xanalyze\api\product.py", line 3, in <module>
    import bitrix
ModuleNotFoundError: No module named 'bitrix'


Задача состоит в том, чтобы обеспечить максимально простой доступ к классам.
Объявление 1 (идеально)
product = api.Product()
Объявление 2 (идеально)
product = Product()
Объявление 3 (нежелательно)
product = product.Product()

А все остальные действия, не связанные с классом Product должны быть скрыты. Т.е. здесь классы Bitrix и Storage выступают больше для логического разделения кода. Очень важно избежать нагромождения в виде создания каждого экземпляра класса в main.py. Вопрос даже не в нагромождении. Итоговая реализация в мейн вообще не должна касаться других классов, кроме Product. Всё остальное должно происходить под капотом внутри Product.

Так же готов послушать не только способы решения данной проблемы, но и по подходу к структуризации в целом.
Каждый объект класса Product представляет собой в буквальном смысле какой-то продукт, с уникальными полями (name, uuid и т.д.)
Класс Bitrix и Storage не нуждаются в объектах вообще (синглтон? статика?) и выполняют роль получения данных с "Моего Склада" и "Битрикса".

В итоге это всё агрегируется в нечто такое:
print (product[0].name) # "Наименование такое-то"

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

Благодарю за любую помощь заранее!
  • Вопрос задан
  • 187 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы