Цель
Я использую mypy для проверки типа моего кода.Локально это работает нормально, если запустить mypy --install-types один раз при установке. Он устанавливает, например. scipy-stubs, потому что заглушки находятся в дополнительном пакете. Больше ничего не устанавливается. Я предполагаю, что это связано с тем, что все зависимости уже установлены внутри моей виртуальной среды.
В CI я также хочу выполнить быструю проверку типов и, таким образом, установить только те части пакета, которые необходимы для проверки типов. Поскольку это докер-контейнер, который заново настраивается при каждом запуске, я бы не хотел устанавливать полные пакеты.
Как установить только типы пакета pypi?
Исследование: typeshed
Благодаря усилиям проекта typeshed можно установить типы-... для многих проектов, например типы-запросы:Код: Выделить всё
pip install types-requests
Mypy использует файлы-заглушки, хранящиеся в репозитории typeshed, для определения типов функций, классов и других определений стандартной библиотеки и сторонних библиотек.
Сторонние пакеты
Не все пакеты содержатся в typeshed. Для популярных пакетов обычно существуют пакеты-заглушки, см., например. Как я могу получить файлы-заглушки для `matplotlib`, `numpy`, `scipy`, `pandas` и т. д.?.Существуют pandas-stubs или scipy-stubs, которые представляют собой отдельные модули, как описано здесь. Я также нашел numpy.typing как отдельный модуль, который можно установить. С другой стороны, matplotlib.typing — это отдельный модуль, который недоступен при установке через pip. Более того, при проверке зависимостей кажется, что numpy.typing на самом деле зависит от полной установки numpy, в то время как, например, scipy-stubs он не зависит от Python:
Код: Выделить всё
$ uv tree
Resolved 10 packages in 1ms
tmpuv v0.1.0
├── numpy-typing v1.1.1
│ └── numpy v2.2.6
└── scipy-stubs v1.15.3.0
└── optype v0.9.3
└── typing-extensions v4.15.0
Спецификации PEP
Самый последний документ — «Распространение информации о типе», который является частью спецификации типизации Python.Он основан на два замененных PEP, PEP 484 – Подсказки по типам, гл. Файлы-заглушки и [PEP 561 – Распространение и упаковка информации о типах] (PEP 561 – Распространение и упаковка информации о типах)
Глава Информация о типах в библиотеках emtnions три способа распространения типов:
- Сопровождающий пакета хотел бы добавить информацию о типе в строке.
- Сопроводитель пакета хотел бы добавить информацию о типе через заглушки.
- Сторонняя сторона или сопровождающий пакета хотели бы поделиться файлами-заглушками для пакета.
Для сопровождающих пакетов, желающих отправлять файлы-заглушки, содержащие все их типы информации, желательно, чтобы заглушки *.pyi находились рядом с соответствующими файлами *.py. Однако заглушки также можно вынести в отдельный пакет и распространять отдельно.
Мои выводы/предположения
Похоже, во-первых 3. подход используется для многих пакетов. Затем numpy и matplotlib перешли на подход 1., а scipy и pandas перешли на подход 2., а спецификация поощряет подход 1. В проекте typeshed также используется подход 3.Для меня это означает, что установка отдельных типов возможна только в рамках 2 и 3 описанных выше подходов и полностью зависит от решения сопровождающих, когда они решат использовать типизацию. Кроме того, в будущем все меньше и меньше пакетов будут иметь отдельные заглушки, а это будет означать, что то, что я хочу сделать, в общем случае невозможно.
Кто-то все же нашел решение? Я мог себе представить, что можно будет извлечь типы из пакета. Или есть совершенно другой способ решить мою «проблему Y», то есть быстро выполнить проверку типов в CI.
Подробнее здесь: https://stackoverflow.com/questions/798 ... pi-package
Мобильная версия