Skip to content

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

@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

    pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    Alternative Proxy

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy