mypy icon indicating copy to clipboard operation
mypy copied to clipboard

New enum features in Python 3.11

Open AlexWaygood opened this issue 3 years ago • 4 comments

There's a ton of new enum features in Python 3.11 that mypy doesn't yet support:

  • [x] enum.property
  • [ ] enum.verify
  • [x] enum.(non)member
  • [x] ReprEnum
  • [ ] StrEnum

enum.property is not yet supported:

  • #12483

The new enum.verify decorator isn't supported: the following snippet will raise an exception at runtime on 3.11 due to not all values being unique, but it passes mypy:

from enum import Enum, verify, UNIQUE

@verify(UNIQUE)
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
    CRIMSON = 1

enum.member/enum.nonmember. The docs are a bit thin on these, but it looks like in the following enum, BAR is converted to become a member, but BAZ is not:

from enum import Enum, nonmember

class Foo(Enum):
    BAR = 1
    BAZ = nonmember(2)

(These two can also be used as decorators)


ReprEnum: this doesn't need any special support by mypy, but the following mypy bug but means that it can't really be used idiomatically at the moment:

  • #12787

StrEnum: I didn't think this required any special treatment from mypy, but there's a weird bug here in mypy's handling of StrEnum:

  • #14688

AlexWaygood avatar May 22 '22 10:05 AlexWaygood

There are 83 open Enum mypy issues at the the time of this writing.

Getting the Enum datatype to work with mypy is becoming impossible as I find myself having to use cast() in at least every other line.

electric-coder avatar May 30 '23 21:05 electric-coder

@AlexWaygood there's also Enum's _new_member_ that hasn't been mentioned in the docs nor in the mypy repository.

electric-coder avatar Dec 28 '23 02:12 electric-coder

With https://github.com/python/mypy/pull/17376 being merged we should be able to check off enum.nonmember, no?

CoolCat467 avatar Jun 16 '24 15:06 CoolCat467

With #17376 being merged we should be able to check off enum.nonmember, no?

Done

AlexWaygood avatar Jun 16 '24 15:06 AlexWaygood