Skip to content

3.11 creates doctests for Enum subclasses brittle against globs and overridden __repr__ #93976

Closed
@jacobtylerwalls

Description

@jacobtylerwalls

Bug report

In 3.11, subclassing Enum without providing a docstring causes tests to be added to a module's doctest suite.

  • This lengthens test suites
  • This creates failures if Enum is not provided in the globs argument to doctest test runners
  • This creates failures if __repr__ is overridden
import re
from enum import Enum

class MyEnum(Enum):
    def __repr__(self):
        """Suppress the trailing colon and integer"""
        return re.sub(r': \d+', '', super().__repr__())


class FinalEnum(MyEnum):
    MEMBER = 1


if __name__ == "__main__":
    import doctest
    doctest.testmod(globs={'MyEnum': MyEnum, 'FinalEnum': FinalEnum})

3.10

$ python3.10 e.py -v
4 items had no tests:
    __main__
    __main__.FinalEnum
    __main__.MyEnum
    __main__.MyEnum.__repr__
0 tests in 4 items.
0 passed and 0 failed.
Test passed.

3.11

$ python3.11 e.py
**********************************************************************
File "/Users/.../e.py", line ?, in __main__.FinalEnum
Failed example:
    FinalEnum.MEMBER
Expected:
    <FinalEnum.MEMBER: 1>
Got:
    <FinalEnum.MEMBER>
**********************************************************************
File "/Users/.../e.py", line ?, in __main__.FinalEnum
Failed example:
    FinalEnum(1)
Expected:
    <FinalEnum.MEMBER: 1>
Got:
    <FinalEnum.MEMBER>
**********************************************************************
File "/Users/.../e.py", line ?, in __main__.FinalEnum
Failed example:
    FinalEnum['MEMBER']
Expected:
    <FinalEnum.MEMBER: 1>
Got:
    <FinalEnum.MEMBER>
**********************************************************************
File "/Users/.../e.py", line ?, in __main__.FinalEnum
Failed example:
    list(FinalEnum)
Expected:
    [<FinalEnum.MEMBER: 1>]
Got:
    [<FinalEnum.MEMBER>]
**********************************************************************
File "/Users/.../e.py", line 10, in __main__.MyEnum
Failed example:
    class Color(Enum):
        RED = 1
        BLUE = 2
        GREEN = 3
Exception raised:
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/doctest.py", line 1350, in __run
        exec(compile(example.source, filename, "single",
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "<doctest __main__.MyEnum[0]>", line 1, in <module>
        class Color(Enum):
                    ^^^^
    NameError: name 'Enum' is not defined
**********************************************************************
File "/Users/.../e.py", line 19, in __main__.MyEnum
Failed example:
    Color.RED
Exception raised:
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/doctest.py", line 1350, in __run
        exec(compile(example.source, filename, "single",
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "<doctest __main__.MyEnum[1]>", line 1, in <module>
        Color.RED
        ^^^^^
    NameError: name 'Color' is not defined
**********************************************************************
File "/Users/.../e.py", line 24, in __main__.MyEnum
Failed example:
    Color(1)
Exception raised:
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/doctest.py", line 1350, in __run
        exec(compile(example.source, filename, "single",
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "<doctest __main__.MyEnum[2]>", line 1, in <module>
        Color(1)
        ^^^^^
    NameError: name 'Color' is not defined
**********************************************************************
File "/Users/.../e.py", line 29, in __main__.MyEnum
Failed example:
    Color['RED']
Exception raised:
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/doctest.py", line 1350, in __run
        exec(compile(example.source, filename, "single",
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "<doctest __main__.MyEnum[3]>", line 1, in <module>
        Color['RED']
        ^^^^^
    NameError: name 'Color' is not defined
**********************************************************************
File "/Users/.../e.py", line 34, in __main__.MyEnum
Failed example:
    len(Color)
Exception raised:
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/doctest.py", line 1350, in __run
        exec(compile(example.source, filename, "single",
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "<doctest __main__.MyEnum[4]>", line 1, in <module>
        len(Color)
            ^^^^^
    NameError: name 'Color' is not defined
**********************************************************************
File "/Users/.../e.py", line 37, in __main__.MyEnum
Failed example:
    list(Color)
Exception raised:
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/doctest.py", line 1350, in __run
        exec(compile(example.source, filename, "single",
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "<doctest __main__.MyEnum[5]>", line 1, in <module>
        list(Color)
             ^^^^^
    NameError: name 'Color' is not defined
**********************************************************************
2 items had failures:
   4 of   5 in __main__.FinalEnum
   6 of   6 in __main__.MyEnum
***Test Failed*** 10 failures.

Your environment

Python 3.11.0b3

cc/ @mscuthbert (FYI: a potential workaround is to add docstrings)

Metadata

Metadata

Assignees

Labels

3.11only security fixes3.12only security fixesstdlibPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions