Мне пришлось бороться, чтобы иметь возможность это сделать. воспроизводить. Это было не так просто.
Основная проблема
Согласно стилю импорта, переменную модуля можно дублировать ( создается несколько раз, даже без циклического импорта). Это очень сложно увидеть во время программы, и отладка может оказаться утомительной.
Основной вопрос
Что такое Как лучше всего избежать этой проблемы?
Иллюстрация
Вот простой проект
Код: Выделить всё
PROJECT ROOT FOLDER
└───app
│ main.py
│
└───websocket
a.py
b.py
ws.py
__init__.py
Код: Выделить всё
import sys
def log_modules():
print("\n\nModules currently in cache:")
for module_name in sys.modules:
if ("web" in module_name or "ws" in module_name) and ("windows" not in module_name and "asyncio" not in module_name):
print(f" - {module_name}: {id(sys.modules[module_name])}")
from app.websocket.a import a
log_modules()
from app.websocket.b import b
log_modules()
if __name__ == "__main__":
a()
b()
Код: Выделить всё
class ConnectionManager:
def __init__(self):
print(f"New ConnectionManager object created, id: {id(self)}")
self.caller_list = []
def use(self, caller):
self.caller_list.append(caller)
print(f"ConnectionManager object used by {caller}, id: {id(self)}. Callers = {self.caller_list}")
websocket_manager = ConnectionManager()
Код: Выделить всё
from websocket.ws import websocket_manager #
Подробнее здесь: [url]https://stackoverflow.com/questions/78998063/how-to-avoid-the-duplicate-module-import-trap-in-python[/url]