diff options
author | orlnub123 <orlnub123@gmail.com> | 2018-09-12 17:28:53 (GMT) |
---|---|---|
committer | Ethan Furman <ethan@stoneleaf.us> | 2018-09-12 17:28:53 (GMT) |
commit | 0fb9fadd3b3e9e3698647e0b92d49b0b7aacd979 (patch) | |
tree | 0a53251ce3c6655e1a291d2c668e74bbb1318ea7 /Lib/test/test_enum.py | |
parent | f52237400b9960d434c5d0676a3479b8c1e8c869 (diff) | |
download | cpython-0fb9fadd3b3e9e3698647e0b92d49b0b7aacd979.zip cpython-0fb9fadd3b3e9e3698647e0b92d49b0b7aacd979.tar.gz cpython-0fb9fadd3b3e9e3698647e0b92d49b0b7aacd979.tar.bz2 |
bpo-34282: Fix Enum._convert shadowing members named _convert (GH-8568)
* Fix enum members getting shadowed by parent attributes
* Move Enum._convert to EnumMeta._convert_
* Deprecate _convert
Diffstat (limited to 'Lib/test/test_enum.py')
-rw-r--r-- | Lib/test/test_enum.py | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index 68483e6..c04d03f 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1,6 +1,7 @@ import enum import inspect import pydoc +import sys import unittest import threading from collections import OrderedDict @@ -1511,6 +1512,23 @@ class TestEnum(unittest.TestCase): yellow = 6 self.assertEqual(MoreColor.magenta.hex(), '5 hexlified!') + def test_subclass_duplicate_name(self): + class Base(Enum): + def test(self): + pass + class Test(Base): + test = 1 + self.assertIs(type(Test.test), Test) + + def test_subclass_duplicate_name_dynamic(self): + from types import DynamicClassAttribute + class Base(Enum): + @DynamicClassAttribute + def test(self): + return 'dynamic' + class Test(Base): + test = 1 + self.assertEqual(Test.test.test, 'dynamic') def test_no_duplicates(self): class UniqueEnum(Enum): @@ -2668,7 +2686,7 @@ CONVERT_TEST_NAME_F = 5 class TestIntEnumConvert(unittest.TestCase): def test_convert_value_lookup_priority(self): - test_type = enum.IntEnum._convert( + test_type = enum.IntEnum._convert_( 'UnittestConvert', ('test.test_enum', '__main__')[__name__=='__main__'], filter=lambda x: x.startswith('CONVERT_TEST_')) @@ -2678,7 +2696,7 @@ class TestIntEnumConvert(unittest.TestCase): self.assertEqual(test_type(5).name, 'CONVERT_TEST_NAME_A') def test_convert(self): - test_type = enum.IntEnum._convert( + test_type = enum.IntEnum._convert_( 'UnittestConvert', ('test.test_enum', '__main__')[__name__=='__main__'], filter=lambda x: x.startswith('CONVERT_TEST_')) @@ -2694,6 +2712,24 @@ class TestIntEnumConvert(unittest.TestCase): if name[0:2] not in ('CO', '__')], [], msg='Names other than CONVERT_TEST_* found.') + @unittest.skipUnless(sys.version_info[:2] == (3, 8), + '_convert was deprecated in 3.8') + def test_convert_warn(self): + with self.assertWarns(DeprecationWarning): + enum.IntEnum._convert( + 'UnittestConvert', + ('test.test_enum', '__main__')[__name__=='__main__'], + filter=lambda x: x.startswith('CONVERT_TEST_')) + + @unittest.skipUnless(sys.version_info >= (3, 9), + '_convert was removed in 3.9') + def test_convert_raise(self): + with self.assertRaises(AttributeError): + enum.IntEnum._convert( + 'UnittestConvert', + ('test.test_enum', '__main__')[__name__=='__main__'], + filter=lambda x: x.startswith('CONVERT_TEST_')) + if __name__ == '__main__': unittest.main() |