Импортировать модули асинхронно, чтобы иметь дело с циклами импорта? - PullRequest
0 голосов
/ 18 октября 2018

Этот поток объясняет, что циклы импорта можно прервать, поместив операторы импорта в конец файла .py или ограничив область импорта.Тем не менее, это кажется очень плохим способом решения проблемы, в основном потому, что он, скорее всего, будет не поддерживаемым (особенно с помощью метода scope).

Как человек, который только что обнаружил asyncio, мне было интересно, было лиспособ использовать его для работы с циклами импорта, и что более важно, если это даже хорошая идея.Например, импорт модуля может быть ожидаемой задачей, которая завершается, когда модуль готов, т.е. когда все необходимые атрибуты определены.

Например:

breakfast.py
cupboard.py
eggs
├── __init__.py
├── yolk.py
└── white.py

breakfastначинается с import eggs, а затем определяет класс ScrambledEggs.cupboard импортирует breakfast и определяет два класса: Pan и Plate, оба из которых используют breakfast.ScrambledEggs.__init__.py импортирует yolk и white, оба из которых импортируют Pan из cupboard для определения методов приготовления.Однако при импорте cupboard определение класса Pan пытается использовать breakfast.ScrambledEggs, который еще не определен.Это приводит к ошибке.

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

В любом случае, мойИдея решения этой проблемы состояла бы в том, чтобы определить импорт в breakfast.py как асинхронные задачи и запустить их все сразу.Затем я бы сделал определение ScrambledEggs ожидаемой задачей, для которой cupboard пришлось бы ждать, пока не будет использовано ScrambledEggs в его собственном коде (т. Е. Определены Pan и Plate).Аналогичным образом, yolk и white могут подождать, пока cupboard определит Pan, прежде чем приступить к использованию класса.

Возможны ли такие вещи?Есть ли лучшее решение?Или я полностью неправильно понимаю использование и смысл асинхронных задач в Python?Извините, если это глупый вопрос.

...