@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, но не нахожу этот способ достаточно приемлемым.

Благодарю за любую помощь заранее!
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
rSedoy
@rSedoy
Python/Django
1. from api.product import Product
2. внутри модуля, т.е. в product.py должно быть from .bitrix import Bitrix
3. ну и про __init__.py не забывайте, там же можно сделать, но это необязательно, чтобы работал такой импорт from api import Product
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы