I haven't received any answers to the following StackOverflow post, so I thought I'd also post it here. I'm not sure if it's an actual bug or if it's just considered good practice to always have something like else: raise Exception at the end of if / elif block.
I am getting a MyPy error "Missing return statement", even when I check for all possible cases inside a function.
For example, in the following code, MyPy is still giving me an error "9: error: Missing return statement", even though color can only be Color.RED, Color.GREEN, or Color.BLUE, and I test all those cases!
class Color(enum.IntEnum):
RED: int = 1
GREEN: int = 2
BLUE: int = 3
def test_enum(color: Color) -> str:
if color == Color.RED:
return "red"
elif color == Color.GREEN:
return "green"
elif color == Color.BLUE:
return "blue"
This code is fragile; if Color will change, it will silently break. The right way IMO is to add assert False at the end. This will also silence mypy.
To the point, I don't think it's worth the special casing inside mypy. If we'll ever have singleton types, it might be possible to make it work out of the box.
PEP 484 actually explicitly specifies that examples like this should be supported. I am not sure if we already have an issue for this, so I will keep this open.
Just for reference, the relevant section is https://www.python.org/dev/peps/pep-0484/#support-for-singleton-types-in-unions
I think we can now track this in https://github.com/python/mypy/issues/6366, which is a more general issue.
Most helpful comment
PEP 484 actually explicitly specifies that examples like this should be supported. I am not sure if we already have an issue for this, so I will keep this open.