Skip to content

MyPy gives error “Missing return statement” even when all cases are tested #4223

Closed

Description

@ostrokach

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"

Activity

  1. elazarg commented on Nov 8, 2017

    @elazarg
    Contributor

    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.

  2. ilevkivskyi commented on Nov 13, 2017

    @ilevkivskyi
    Member

    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.

  3. ilevkivskyi commented on Nov 13, 2017

    @ilevkivskyi
    Member
  4. ilevkivskyi commented on Jul 6, 2019

    @ilevkivskyi
    Member

    I think we can now track this in #6366, which is a more general issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions