Я пишу несколько заглушек типов Python для пакета и столкнулся с функцией, которая может принимать либо список, либо, если доступен numpy, numpy.ndarray. Если присутствует numpy и функции присвоен numpy.ndarray, она преобразует массив в список, прежде чем продолжить работу с остальной частью функции, но если numpy отсутствует, раздел, обрабатывающий массив, пропускается. Вот пример этого:
Код: Выделить всё
def foo(bar):
try:
import numpy as np
except ImportError:
np = None
if (np is not None) and isinstance(bar, np.ndarray):
bar = bar.tolist()
bar.append(0)
return bar
Проблема, с которой я столкнулся, заключается в том, как включить np.ndarray в подсказку типа для bar без строгого требования присутствия numpy, когда включена проверка типа. Я могу сделать следующее, чтобы сохранить numpy необязательным в время выполнения:
Код: Выделить всё
import typing as ty
if ty.TYPE_CHECKING:
import numpy as np
def foo(bar: list | np.ndarray[tuple[int]]) -> list:
try:
import numpy as np
except ImportError:
np = None
if (np is not None) and isinstance(bar, np.ndarray):
bar = bar.tolist()
bar.append(0)
return bar
Однако это по-прежнему вызывает следующую ошибку в mypy, если он не может найти numpy:
Код: Выделить всё
Cannot find implementation or library stub for module named "numpy" Mypy(import-not-found) [Ln 4, Col 1]
Можно ли избежать этой ошибки, даже если numpy не установлен? Очевидно, что установка numpy исключительно для целей набора текста не представляет большого труда, но если бы в подобных ситуациях было значительно больше дополнительных зависимостей, было бы несколько неудобно/неэффективно устанавливать все дополнительные зависимости для удовлетворения mypy, не используя при этом ни одной из реальных функций пакетов. Я также не хочу полностью игнорировать ошибки, поскольку было бы легко скрыть законную проблему с отсутствующими заглушками типов в списке посторонних ошибок импорта mypy.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... pendencies