Typing simple descriptor example as Enum class constant with mypy

Viewed 75

I wanted to implement a class constant in an Enum using a descriptor with a type hint that mypy would recognize. My first step was trying the docs Simple example: A descriptor that returns a constant.

class Ten:
    def __get__(self, obj, objtype=None) -> int:
        return 10


class A:
    x = 5      # Regular class attribute
    y = Ten()  # Descriptor instance


reveal_type(A.x)  # Revealed type is "builtins.int"
reveal_type(A.y)  # Revealed type is "builtins.int"

Afterwards, applying the above simple example to an Enum has mypy recognize the type as a Literal instead of an int:

Revealed type is "Literal[my_module.B.y]?"

from enum import Enum


class Ten:
    def __get__(self, obj, objtype=None) -> int:
        return 10


class B(Enum):
    One = 1
    Two = 2

    y = Ten()  # Descriptor instance


reveal_type(B.y)   # Revealed type is "Literal[my_module.B.y]?"

Am I doing something wrong or Is this a mypy bug? If it's a bug is there a workaround?

0 Answers
Related