diff options
| author | Ethan Furman <ethan@stoneleaf.us> | 2024-04-09 18:31:07 (GMT) |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-09 18:31:07 (GMT) |
| commit | e5521bcca916c63866f0aa1c4dfb3a315d6ada73 (patch) | |
| tree | 235bc413efdfeb14c807e42c96541282e3434387 /Lib/enum.py | |
| parent | d5f1139c79525b4e7e4e8ad8c3e5fb831bbc3f28 (diff) | |
| download | cpython-e5521bcca916c63866f0aa1c4dfb3a315d6ada73.zip cpython-e5521bcca916c63866f0aa1c4dfb3a315d6ada73.tar.gz cpython-e5521bcca916c63866f0aa1c4dfb3a315d6ada73.tar.bz2 | |
gh-117663: [Enum] fix _simple_enum's detection of aliases (GH-117664)
Diffstat (limited to 'Lib/enum.py')
| -rw-r--r-- | Lib/enum.py | 72 |
1 files changed, 44 insertions, 28 deletions
diff --git a/Lib/enum.py b/Lib/enum.py index 2a135e1..98a49ea 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -1088,8 +1088,6 @@ class EnumType(type): setattr(cls, name, member) # now add to _member_map_ (even aliases) cls._member_map_[name] = member - # - cls._member_map_[name] = member EnumMeta = EnumType # keep EnumMeta name for backwards compatibility @@ -1802,20 +1800,31 @@ def _simple_enum(etype=Enum, *, boundary=None, use_args=None): for name, value in attrs.items(): if isinstance(value, auto) and auto.value is _auto_null: value = gnv(name, 1, len(member_names), gnv_last_values) - if value in value2member_map or value in unhashable_values: + # create basic member (possibly isolate value for alias check) + if use_args: + if not isinstance(value, tuple): + value = (value, ) + member = new_member(enum_class, *value) + value = value[0] + else: + member = new_member(enum_class) + if __new__ is None: + member._value_ = value + # now check if alias + try: + contained = value2member_map.get(member._value_) + except TypeError: + contained = None + if member._value_ in unhashable_values: + for m in enum_class: + if m._value_ == member._value_: + contained = m + break + if contained is not None: # an alias to an existing member - enum_class(value)._add_alias_(name) + contained._add_alias_(name) else: - # create the member - if use_args: - if not isinstance(value, tuple): - value = (value, ) - member = new_member(enum_class, *value) - value = value[0] - else: - member = new_member(enum_class) - if __new__ is None: - member._value_ = value + # finish creating member member._name_ = name member.__objclass__ = enum_class member.__init__(value) @@ -1847,24 +1856,31 @@ def _simple_enum(etype=Enum, *, boundary=None, use_args=None): if value.value is _auto_null: value.value = gnv(name, 1, len(member_names), gnv_last_values) value = value.value + # create basic member (possibly isolate value for alias check) + if use_args: + if not isinstance(value, tuple): + value = (value, ) + member = new_member(enum_class, *value) + value = value[0] + else: + member = new_member(enum_class) + if __new__ is None: + member._value_ = value + # now check if alias try: - contained = value in value2member_map + contained = value2member_map.get(member._value_) except TypeError: - contained = value in unhashable_values - if contained: + contained = None + if member._value_ in unhashable_values: + for m in enum_class: + if m._value_ == member._value_: + contained = m + break + if contained is not None: # an alias to an existing member - enum_class(value)._add_alias_(name) + contained._add_alias_(name) else: - # create the member - if use_args: - if not isinstance(value, tuple): - value = (value, ) - member = new_member(enum_class, *value) - value = value[0] - else: - member = new_member(enum_class) - if __new__ is None: - member._value_ = value + # finish creating member member._name_ = name member.__objclass__ = enum_class member.__init__(value) |
