#python #pycharm
#python #pycharm
Вопрос:
У меня есть обычная библиотека, представленная в pypi. Внутри него есть хитрый способ разрешения имен в модулях, которые мы импортируем. Если я устанавливаю ее в папку Python, обычным способом PyCharm разрешает ее, создает скелет, и я получаю для него автоматическое завершение. Но в нашем проекте мы храним используемые библиотеки в папке проекта, а PyCharm не читает и не обрабатывает библиотеку. Для этого я получил запрос на проверку «неразрешенных ссылок» и красную волновую линию.
Как я могу заставить PyCharm разрешить библиотеку в папке проекта?
Пример:
MyProjectRoot
-- external_libs
--six.py
Когда я пишу:
from external_libs.six.moves import range
PyCharm помечает «перемещено» желтым цветом, а «диапазон» — красной волновой линией.
Комментарии:
1. Попробуйте пометить ее как исходный каталог.
2. К сожалению, это не помогло.
3. Не могли бы вы поделиться примером, пожалуйста? Кроме того, на данный момент вы можете использовать jetbrains.com/help/pycharm/suppressing-inspections.html
4. Каспер, я знаю об отключении проверок и не хочу его использовать. Я добавил пример к вопросу.
5. К сожалению
six
, пакет создает специальные прокси-объекты для загрузки базового модуля при извлечении атрибута. По сути,external_libs.six.moves.range
функция является просто псевдонимом для встроенной функции диапазона. Однако, похоже, что настройка прокси-сервера выполняется PyCharm автоматически при установке библиотеки, но я не уверен, как ее можно реплицировать вручную.
Ответ №1:
Из документации к six
пакету:
Примечание: для того, чтобы выполнить импорт формы:
from six.moves.cPickle import loads work
six помещает специальные прокси-объекты в in sys.modules. Эти прокси лениво загружают базовый модуль при извлечении атрибута.
Из-за этого распознаватель базового пути в PyCharm не может легко найти фактический путь к модулям, которые импортируются для этого пакета и других, использующих тот же подход.
Чтобы преодолеть эту проблему, PyCharm использует типизированные заглушки:
Typeshed — это набор файлов с аннотациями типов для стандартной библиотеки Python и различных пакетов. Типизированные заглушки предоставляют определения для классов, функций и модулей Python, определенных с помощью подсказок по типу. PyCharm использует эту информацию для улучшения завершения кода, проверок и других функций анализа кода.
Типизированные заглушки, которые можно найти в их официальном репозитории, служат в качестве справочной таблицы. Например, если вы ищете range
функцию, six.moves
которая является просто псевдонимом для встроенной range
функции, они помогут PyCharm узнать, как ее разрешить, указав, что при вводе from six.moves import range
это должно быть разрешено примерно так from builtins import range
.
Вы можете переопределить связанные типизированные заглушки, следуя документации PyCharm .
Пример: если вы хотите использовать six
пакет и у вас такая структура папок:
six_reproduce
|─── main.py
│
│
├───external_libs
│ |────six.py
Перейдите в исходное типизированное хранилище и загрузите нужные вам заглушки.
Для python 3 заглушки для six
библиотеки можно найти здесь .
Загрузите папку и поместите ее в раздел external_libs
, чтобы структура вашего проекта стала такой:
six_reproduce
|─── main.py
│
│
├─── external_libs
│ |──── six
│ │ |──── moves
│ │ │
│ │ |──── __init__.pyi
│ │
│ |──── six.py
Теперь PyCharm должен иметь возможность разрешать ваш импорт!
Ответ №2:
Попробуйте это:
import sys
sys.path.append("external_libs")
import six
Комментарии:
1. Это не может помочь во время «разработки».