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 шт):

Автор решения: insolor

Судя по наличию относительного импорта, у вас код в пакете. Если в этом случае проверять код как отдельные файлы, будет только на импорт ругаться:

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.

→ Ссылка