Вышел релиз
Релиз получился объемный: там добавили базовую поддержку Python 3.11, рекурсивные типы, категории ошибок в вывод, и ещё на сдачу наложили разные ломающие изменения. Готовьтесь, при обновлении наверняка будут новые проблемы в коде, который раньше тайп-чекался без ошибок. Ниже выпишу самые важные, на мой взгляд, пункты, а за полным списком изменений идите в блог mypy.
Теперь по умолчанию отключены неявные Optional
типы. Придётся либо явно указывать в тайп хинте, что переменная/аргумент может принимать None
, либо переключать настройку, чтобы вернуть старое неявное поведение:
def foo(s: str = None) -> int: ... # Error!Также тайп-чекер теперь перестал игнорировать пустые функции/методы. Раньше они не проверялись, а теперь проверяются и вызывают ошибки:
def foo(s: str | None = None) -> int: ... # OK
# Error: Missing return statement (no error before 0.990)Через forward reference'ы теперь можно определять рекурсивные типы. Для применения рекурсивных типов нужно обязательно явно указывать тип, потому что если не указать, то
def some_func(arg: str) -> int:
pass
mypy
выведет какой-то многоэтажный нерекурсивный тип. Вот как это выглядит:NaiveJSON = str | list["NaiveJSON"] | dict[str, "NaiveJSON"]Тайп чекер постепенно становится умнее и строже. Гаечки затягиваются — остаётся всё меньше неявного и игнорируемого. И это хорошо.
test_data: NaiveJSON = {"foo": {"bar": "baz"}} # OK