mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-131045: [Enum] fix flag containment checks when using values (GH-131053)
Check would fail if value would create a pseudo-member, but that member had not yet been created. We now attempt to create a pseudo-member for a passed-in value first. Co-authored-by: Tomas R. <tomas.roun8@gmail.com>
This commit is contained in:
parent
db6a998b18
commit
17d06aeb54
3 changed files with 7 additions and 2 deletions
|
@ -739,12 +739,14 @@ class EnumType(type):
|
||||||
`value` is in `cls` if:
|
`value` is in `cls` if:
|
||||||
1) `value` is a member of `cls`, or
|
1) `value` is a member of `cls`, or
|
||||||
2) `value` is the value of one of the `cls`'s members.
|
2) `value` is the value of one of the `cls`'s members.
|
||||||
|
3) `value` is a pseudo-member (flags)
|
||||||
"""
|
"""
|
||||||
if isinstance(value, cls):
|
if isinstance(value, cls):
|
||||||
return True
|
return True
|
||||||
try:
|
try:
|
||||||
return value in cls._value2member_map_
|
cls(value)
|
||||||
except TypeError:
|
return True
|
||||||
|
except ValueError:
|
||||||
return (
|
return (
|
||||||
value in cls._unhashable_values_ # both structures are lists
|
value in cls._unhashable_values_ # both structures are lists
|
||||||
or value in cls._hashable_values_
|
or value in cls._hashable_values_
|
||||||
|
|
|
@ -462,6 +462,7 @@ class _EnumTests:
|
||||||
self.assertEqual(str(TE), "<flag 'MainEnum'>")
|
self.assertEqual(str(TE), "<flag 'MainEnum'>")
|
||||||
self.assertEqual(format(TE), "<flag 'MainEnum'>")
|
self.assertEqual(format(TE), "<flag 'MainEnum'>")
|
||||||
self.assertTrue(TE(5) is self.dupe2)
|
self.assertTrue(TE(5) is self.dupe2)
|
||||||
|
self.assertTrue(7 in TE)
|
||||||
else:
|
else:
|
||||||
self.assertEqual(repr(TE), "<enum 'MainEnum'>")
|
self.assertEqual(repr(TE), "<enum 'MainEnum'>")
|
||||||
self.assertEqual(str(TE), "<enum 'MainEnum'>")
|
self.assertEqual(str(TE), "<enum 'MainEnum'>")
|
||||||
|
@ -4954,6 +4955,7 @@ class Color(enum.Enum)
|
||||||
| `value` is in `cls` if:
|
| `value` is in `cls` if:
|
||||||
| 1) `value` is a member of `cls`, or
|
| 1) `value` is a member of `cls`, or
|
||||||
| 2) `value` is the value of one of the `cls`'s members.
|
| 2) `value` is the value of one of the `cls`'s members.
|
||||||
|
| 3) `value` is a pseudo-member (flags)
|
||||||
|
|
|
|
||||||
| __getitem__(name)
|
| __getitem__(name)
|
||||||
| Return the member matching `name`.
|
| Return the member matching `name`.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix issue with ``__contains__``, values, and pseudo-members for :class:`enum.Flag`.
|
Loading…
Add table
Add a link
Reference in a new issue