Python's type hints are undecidable. You cannot know, without evaluating the type-level program if it will halt.
The only way around this would be to set a recursion depth, which changes the semantics.
The only way around this would be to set a recursion depth, which changes the semantics.
Rust is doing basically the same thing. Default code is "safe", and the compiler is able to prove its correctness. If the compiler can't make heads or tails of it, you have to put it in "unsafe" - and the programmer is expected to check the correctness herself.
This is also true of Python, but a program which is just `print("hi!")` can be statically proven to halt.
I suspect this is true of a very great majority of type hints in Python which actually exist.