Viicos · GitHub

Bug report

Bug description:

With #111815, any exception raised inside the __init__ method of an enum class 1 is expected to be:

  1. instantiable (not the case with Pydantic ValidationErrors, see Python 3.12 Enum Class Validated Initialization TypeError pydantic/pydantic#10593)
  2. instantiable and expected to take a single argument.
try:
exc = None
classdict['_%s__in_progress' % cls] = True
enum_class = super().__new__(metacls, cls, bases, classdict, **kwds)
classdict['_%s__in_progress' % cls] = False
delattr(enum_class, '_%s__in_progress' % cls)
except Exception as e:
# since 3.12 the line "Error calling __set_name__ on '_proto_member' instance ..."
# is tacked on to the error instead of raising a RuntimeError
# recreate the exception to discard
exc = type(e)(str(e))

Meaning the following raises a TypeError instead of the expected MyValueError:

class MyValueError(ValueError):
    def __init__(self, t: str, v: int) -> None:
        self.t = t
        self.v = v
class ValidatedEnum(Enum):
    def __init__(self, value):
        raise MyValueError("", 1)
class MyValidatedEnum(ValidatedEnum):
    FOO = "foo"
# TypeError: MyValueError.__init__() missing 1 required positional argument: 'v'

CPython versions tested on:

3.12

Operating systems tested on:

Linux

Linked PRs

Footnotes

  1. An example is documented as an example here.

Read the original on github.com ↗