Ленивый импорт из подмодулей в __init__.py таким образом, что инструменты анализа кода stati c могут понять - PullRequest
2 голосов
/ 21 февраля 2020

Итак, давайте представим, что у меня есть python пакет библиотечного кода с 20 логически разделенными модулями, и я хочу выбрать 1 или 2 класса из каждого из них для API пакета publi c. Вместо того, чтобы заставлять пользователей импортировать эти классы напрямую из модулей, я хочу сделать их доступными непосредственно из пространства имен пакета, в пределах __init__.py.

Но я не хочу, чтобы все загружалось каждый раз с нетерпением, поскольку загрузка всех 20 модулей всякий раз, когда кто-то пытается получить доступ только к одному классу из одного, является огромной тратой (некоторые из них содержат свои собственные дорогостоящие операции импорта), поэтому я реализую модуль уровня __getattr__() согласно https://www.python.org/dev/peps/pep-0562/ и используйте в нем importlib для загрузки модуля данного класса всякий раз, когда кто-то пытается импортировать этот класс.

Это относительно чистое решение, но часть, которая делает его кошмарным, заключается в том, что это абсолютно убивает stati c инструменты анализа кода, такие как Jedi или PyCharm. Автозаполнение и строки документа при наведении курсора очень важны для меня, так как они значительно увеличивают производительность, поэтому я не хочу писать библиотечный код, который IDE не могут понять.

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

У кого-нибудь есть идеи, как еще я мог бы go об этом? Я надеюсь, что есть какой-то умный способ обойти это, о котором я просто не думал.

...