Content-Length: 323729 | pFad | http://github.com/python/cpython/commit/65dab1506e9c8ac40b3f9da834121d86c6417275

84 gh-92647: [Enum] use final status to determine lookup or create (GH-9… · python/cpython@65dab15 · GitHub
Skip to content

Commit

Permalink
gh-92647: [Enum] use final status to determine lookup or create (GH-9…
Browse files Browse the repository at this point in the history
…9500)

* use final status to determine lookup or create

* 📜🤖 Added by blurb_it.

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
  • Loading branch information
ethanfurman and blurb-it[bot] authored Nov 15, 2022
1 parent 3c57971 commit 65dab15
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 7 deletions.
13 changes: 9 additions & 4 deletions Lib/enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -692,14 +692,16 @@ def __bool__(cls):
"""
return True

def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None):
def __call__(cls, value, names=None, *values, module=None, qualname=None, type=None, start=1, boundary=None):
"""
Either returns an existing member, or creates a new enum class.
This method is used both when an enum class is given a value to match
to an enumeration member (i.e. Color(3)) and for the functional API
(i.e. Color = Enum('Color', names='RED GREEN BLUE')).
The value lookup branch is chosen if the enum is final.
When used for the functional API:
`value` will be the name of the new class.
Expand All @@ -717,12 +719,15 @@ def __call__(cls, value, names=None, *, module=None, qualname=None, type=None, s
`type`, if set, will be mixed in as the first base class.
"""
if names is None: # simple value lookup
if cls._member_map_:
# simple value lookup if members exist
if names:
value = (value, names) + values
return cls.__new__(cls, value)
# otherwise, functional API: we're creating a new Enum type
return cls._create_(
value,
names,
class_name=value,
names=names,
module=module,
qualname=qualname,
type=type,
Expand Down
21 changes: 18 additions & 3 deletions Lib/test/test_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -1321,6 +1321,21 @@ def test_programmatic_function_type_from_subclass_with_start(self):
self.assertIn(e, MinorEnum)
self.assertIs(type(e), MinorEnum)

def test_programmatic_function_is_value_call(self):
class TwoPart(Enum):
ONE = 1, 1.0
TWO = 2, 2.0
THREE = 3, 3.0
self.assertRaisesRegex(ValueError, '1 is not a valid .*TwoPart', TwoPart, 1)
self.assertIs(TwoPart((1, 1.0)), TwoPart.ONE)
self.assertIs(TwoPart(1, 1.0), TwoPart.ONE)
class ThreePart(Enum):
ONE = 1, 1.0, 'one'
TWO = 2, 2.0, 'two'
THREE = 3, 3.0, 'three'
self.assertIs(ThreePart((3, 3.0, 'three')), ThreePart.THREE)
self.assertIs(ThreePart(3, 3.0, 'three'), ThreePart.THREE)

def test_intenum_from_bytes(self):
self.assertIs(IntStooges.from_bytes(b'\x00\x03', 'big'), IntStooges.MOE)
with self.assertRaises(ValueError):
Expand Down Expand Up @@ -1463,7 +1478,7 @@ class MoreColor(Color):
class EvenMoreColor(Color, IntEnum):
chartruese = 7
#
with self.assertRaisesRegex(TypeError, "<enum .Foo.> cannot extend <enum .Color.>"):
with self.assertRaisesRegex(ValueError, "\(.Foo., \(.pink., .black.\)\) is not a valid .*Color"):
Color('Foo', ('pink', 'black'))

def test_exclude_methods(self):
Expand Down Expand Up @@ -4181,7 +4196,7 @@ class TestEnumTypeSubclassing(unittest.TestCase):
Help on class Color in module %s:
class Color(enum.Enum)
| Color(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
| Color(value, names=None, *values, module=None, qualname=None, type=None, start=1, boundary=None)
|
| Method resolution order:
| Color
Expand Down Expand Up @@ -4237,7 +4252,7 @@ class Color(enum.Enum)
Help on class Color in module %s:
class Color(enum.Enum)
| Color(value, names=None, *, module=None, qualname=None, type=None, start=1)
| Color(value, names=None, *values, module=None, qualname=None, type=None, start=1)
|
| Method resolution order:
| Color
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Use final status of an enum to determine lookup or creation branch of functional API.

0 comments on commit 65dab15

Please sign in to comment.








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/python/cpython/commit/65dab1506e9c8ac40b3f9da834121d86c6417275

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy