С
isinstance() всё просто: mypy сам сужает объединение типов в каждой ветке. Сложнее, если объект приходится распознавать по содержимому, например проверять поля словаря. Тогда проверку выносят в отдельный предикат, а TypeGuard сообщает анализатору, какой тип прошёл условие.На этом месте интуиция может подвести: автор несколько раз отказывался от
TypeGuard и заканчивал комментарием # type: ignore. В разборе TypeGuard и TypeIs он начинает с TypedDict для Person и объясняет, почему TypeIs соответствует ожиданиям лучше.Стоит прочитать перед следующим пользовательским предикатом: в статье осталось главное, почему
TypeIs оказался тем интерфейсом, которого автор ожидал от TypeGuard.
