mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-91456: [Enum] Deprecate default auto() behavior with mixed value types (GH-91457)
When used with plain Enum, auto() returns the last numeric value assigned, skipping any incompatible member values (such as strings); starting in 3.13 the default auto() for plain Enums will require all the values to be of compatible types, and will return a new value that is 1 higher than any existing value. Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
This commit is contained in:
parent
7c439dca13
commit
fb1e9506c1
4 changed files with 89 additions and 17 deletions
|
@ -3953,23 +3953,54 @@ class TestInternals(unittest.TestCase):
|
|||
self.assertEqual(Color.blue.value, 'blue')
|
||||
self.assertEqual(Color.green.value, 'green')
|
||||
|
||||
def test_auto_garbage(self):
|
||||
class Color(Enum):
|
||||
red = 'red'
|
||||
blue = auto()
|
||||
@unittest.skipIf(
|
||||
python_version >= (3, 13),
|
||||
'mixed types with auto() no longer supported',
|
||||
)
|
||||
def test_auto_garbage_ok(self):
|
||||
with self.assertWarnsRegex(DeprecationWarning, 'will require all values to be sortable'):
|
||||
class Color(Enum):
|
||||
red = 'red'
|
||||
blue = auto()
|
||||
self.assertEqual(Color.blue.value, 1)
|
||||
|
||||
def test_auto_garbage_corrected(self):
|
||||
class Color(Enum):
|
||||
red = 'red'
|
||||
blue = 2
|
||||
green = auto()
|
||||
@unittest.skipIf(
|
||||
python_version >= (3, 13),
|
||||
'mixed types with auto() no longer supported',
|
||||
)
|
||||
def test_auto_garbage_corrected_ok(self):
|
||||
with self.assertWarnsRegex(DeprecationWarning, 'will require all values to be sortable'):
|
||||
class Color(Enum):
|
||||
red = 'red'
|
||||
blue = 2
|
||||
green = auto()
|
||||
|
||||
self.assertEqual(list(Color), [Color.red, Color.blue, Color.green])
|
||||
self.assertEqual(Color.red.value, 'red')
|
||||
self.assertEqual(Color.blue.value, 2)
|
||||
self.assertEqual(Color.green.value, 3)
|
||||
|
||||
@unittest.skipIf(
|
||||
python_version < (3, 13),
|
||||
'mixed types with auto() will raise in 3.13',
|
||||
)
|
||||
def test_auto_garbage_fail(self):
|
||||
with self.assertRaisesRegex(TypeError, 'will require all values to be sortable'):
|
||||
class Color(Enum):
|
||||
red = 'red'
|
||||
blue = auto()
|
||||
|
||||
@unittest.skipIf(
|
||||
python_version < (3, 13),
|
||||
'mixed types with auto() will raise in 3.13',
|
||||
)
|
||||
def test_auto_garbage_corrected_fail(self):
|
||||
with self.assertRaisesRegex(TypeError, 'will require all values to be sortable'):
|
||||
class Color(Enum):
|
||||
red = 'red'
|
||||
blue = 2
|
||||
green = auto()
|
||||
|
||||
def test_auto_order(self):
|
||||
with self.assertRaises(TypeError):
|
||||
class Color(Enum):
|
||||
|
@ -3991,6 +4022,22 @@ class TestInternals(unittest.TestCase):
|
|||
self.assertEqual(Color.red.value, 'pathological case')
|
||||
self.assertEqual(Color.blue.value, 'blue')
|
||||
|
||||
@unittest.skipIf(
|
||||
python_version < (3, 13),
|
||||
'auto() will return highest value + 1 in 3.13',
|
||||
)
|
||||
def test_auto_with_aliases(self):
|
||||
class Color(Enum):
|
||||
red = auto()
|
||||
blue = auto()
|
||||
oxford = blue
|
||||
crimson = red
|
||||
green = auto()
|
||||
self.assertIs(Color.crimson, Color.red)
|
||||
self.assertIs(Color.oxford, Color.blue)
|
||||
self.assertIsNot(Color.green, Color.red)
|
||||
self.assertIsNot(Color.green, Color.blue)
|
||||
|
||||
def test_duplicate_auto(self):
|
||||
class Dupes(Enum):
|
||||
first = primero = auto()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue