Some thoughts on Union[X, NoReturn]
#994
Replies: 2 comments 8 replies
-
I agree that @overload
def func(x: int) -> NoReturn:
...
@overload
def func(x: str) -> str:
...
def func(x: int | str) -> str | NoReturn:
... Without the ability to use So there is at least one legitimate use of a return type of the form def func() -> str | NoReturn:
...
reveal_type(func()) # pyright: str, mypy: Union[str, <nothing>]
func().lower() # pyright: no error, # mypy: NoReturn" of "Union[str, NoReturn]" has no attribute "lower" |
Beta Was this translation helpful? Give feedback.
-
So, technically speaking all I see some benefit in allowing explicit Probably you can use some |
Beta Was this translation helpful? Give feedback.
-
I stumbled upon code that looked like this recently:
The function's signature seems to say that it "sometimes returns int, and sometimes it never returns". Mypy is happy with this, but I am not.
There's a few reasons I think this is wrong:
Replacing
Union[int, NoReturn]
here with justint
is also perfectly valid.Mypy seems fine with this code:
I believe that every instance of
NoReturn | X | Y | ...
can be written without the NoReturn, i.e.X | Y | ...
Having
NoReturn
in a union defeats its entire purpose.What's the use case of NoReturn? It is to avoid cases like these:
If instead of the function never returning, it returns even some times, mypy won't be able to give you this error, making the use of
int | NoReturn
not really useful.If
Union[X, NoReturn]
is correct here, all your code is wrong.If the type hint for "The function sometimes doesn't return" is actually
Union[X, NoReturn]
, then any piece of code that raises an exception needs to be refactored.This, for example:
This function as well, doesn't return sometimes. Does that mean we should use
Union[int, NoReturn]
here too? Even though here:The type of
num
is guaranteed to beint
? For this reason, I'd sayint
as a return type is much better, andUnion[X, NoReturn]
doesn't make sense.This is why I wanted to know why mypy allows people to use
Union[X, NoReturn]
. I think it should not be allowed. I'd really like some discussion on this.Beta Was this translation helpful? Give feedback.
All reactions