Как избежать «ловушки импорта дубликатов модулей» в Python?Python

Программы на Python
Anonymous
Как избежать «ловушки импорта дубликатов модулей» в Python?

Сообщение Anonymous »

Недавно я столкнулся с запутанной проблемой, связанной с импортом модулей в Python, особенно со способом дублирования экземпляров классов на основе разных стилей импорта.
Мне пришлось бороться, чтобы иметь возможность это сделать. воспроизводить. Это было не так просто.
Основная проблема
Согласно стилю импорта, переменную модуля можно дублировать ( создается несколько раз, даже без циклического импорта). Это очень сложно увидеть во время программы, и отладка может оказаться утомительной.
Основной вопрос
Что такое Как лучше всего избежать этой проблемы?
Иллюстрация
Вот простой проект

Код: Выделить всё

PROJECT ROOT FOLDER
└───app
│   main.py
│
└───websocket
a.py
b.py
ws.py
__init__.py
main.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()
ws.py

Код: Выделить всё

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()
a.py

Код: Выделить всё

from websocket.ws import websocket_manager  # 

Подробнее здесь: [url]https://stackoverflow.com/questions/78998063/how-to-avoid-the-duplicate-module-import-trap-in-python[/url]

Вернуться в «Python»