Mypy, проверка импортируемых типов
Имеем 2 файла:
# utils.py
class SomeClass:
...
# main.py
from .utils import SomeClass
def some_func(argument: SomeClass):
...
some_func(123)
Mypy не будет ругаться на вызов функции some_func с аргументом 123, так как, по видимому, из-за того что тип SomeClass импортирован, не знает как сравнить int и SomeClass.
При этом если SomeClass будет находится в том же файле, что и функция, Mypy проверку сделает и укажет на неверно переданный тип.
Умеет ли Mypy проверять импортируемые типы, или тут ничего не поделать?
UPD:
Mypy запускаю из корная проекта командой mypy .. Пробовал запускать с параметром --strict
Ответы (1 шт):
Судя по наличию относительного импорта, у вас код в пакете. Если в этом случае проверять код как отдельные файлы, будет только на импорт ругаться:
main.py:1: error: Skipping analyzing ".utils": module is installed, but missing library stubs or py.typed marker [import-untyped]
Фактически ошибка означает, что mypy не может найти импортируемый модуль.
Чтобы mypy относительные импорты мог обрабатывать, нужно проверять код как пакет, запуская снаружи пакета с ключом -p (или --package):
❯ tree .
.
└── package
├── main.py
└── utils.py
1 directory, 2 files
❯ mypy -p package
package/main.py:8: error: Argument 1 to "some_func" has incompatible type "int"; expected "SomeClass" [arg-type]
Found 1 error in 1 file (checked 3 source files)
См. документацию Running mypy and managing imports - Specifying code to be, пункт 3.