Skip to content

enum.Flag ignores bitwise operator methods from mixins #121291

@gswifort

Description

@gswifort

When I define methods ('__or__', '__and__', '__xor__', '__ror__', '__rand__', '__rxor__', '__invert__')
directly in the class inheriting from enum.Flag, these methods are "added" (mro) to the members, however, if the method is defined in the mixin, the methods defined in enum.Flag are added (e.g. Flag.__or__). I would expect methods to be called from mixin.

from enum import Flag


class Mixin:
    def __or__(self, value): ...


class MyFlag(Mixin, Flag):
    pass


class MyFlag2(Flag):
    def __or__(self, value): ...


print(MyFlag.__or__.__qualname__)  # Flag.__or__, I would expect Mixin.__or__
print(MyFlag2.__or__.__qualname__)  # MyFlag2.__or__ - GOOD

cpython/Lib/enum.py

Lines 610 to 619 in 0898354

if Flag is not None and issubclass(enum_class, Flag):
for name in (
'__or__', '__and__', '__xor__',
'__ror__', '__rand__', '__rxor__',
'__invert__'
):
if name not in classdict:
enum_method = getattr(Flag, name)
setattr(enum_class, name, enum_method)
classdict[name] = enum_method

Metadata

Metadata

Assignees

Labels

stdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions