Experiment: remove IntFlag from enum.auto (#12760)

comments in https://github.com/python/typeshed/issues/10384 suggest
that type checkers should special case enum.auto rather than
relying on the IntFlag hack. It's been a while since then, do we
still need it?
This commit is contained in:
Stephen Morton
2024-10-08 21:24:31 -07:00
committed by GitHub
parent 4b11151a0c
commit 3e29e05e4a
2 changed files with 18 additions and 2 deletions

View File

@@ -670,3 +670,8 @@ typing(_extensions)?\.IO\.__iter__ # See https://github.com/python/typeshed/com
(xml.etree.cElementTree.XMLPullParser.flush)?
(xml.parsers.expat.XMLParserType.GetReparseDeferralEnabled)?
(xml.parsers.expat.XMLParserType.SetReparseDeferralEnabled)?
# enum.auto is magic, see comments
enum.auto.__or__
enum.auto.__and__
enum.auto.__xor__

View File

@@ -316,13 +316,24 @@ else:
__rand__ = __and__
__rxor__ = __xor__
# subclassing IntFlag so it picks up all implemented base functions, best modeling behavior of enum.auto()
class auto(IntFlag):
class auto:
_value_: Any
@_magic_enum_attr
def value(self) -> Any: ...
def __new__(cls) -> Self: ...
# These don't exist, but auto is basically immediately replaced with
# either an int or a str depending on the type of the enum. StrEnum's auto
# shouldn't have these, but they're needed for int versions of auto (mostly the __or__).
# Ideally type checkers would special case auto enough to handle this,
# but until then this is a slightly inaccurate helping hand.
def __or__(self, other: int | Self) -> Self: ...
def __and__(self, other: int | Self) -> Self: ...
def __xor__(self, other: int | Self) -> Self: ...
__ror__ = __or__
__rand__ = __and__
__rxor__ = __xor__
if sys.version_info >= (3, 11):
def pickle_by_global_name(self: Enum, proto: int) -> str: ...
def pickle_by_enum_name(self: _EnumMemberT, proto: int) -> tuple[Callable[..., Any], tuple[type[_EnumMemberT], str]]: ...