GeezerVison is showing github.com — bpo-34750: [Enum] add `_EnumDict.update()` support (GH-23725) · python/cpython@a658287
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: Lib/enum.py +11-1Lines changed: 11 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -136,7 +136,7 @@ def __setitem__(self, key, value): | 136 | 136 | key = '_order_' | 137 | 137 | elif key in self._member_names: | 138 | 138 | # descriptor overwriting an enum? | 139 | | - raise TypeError('Attempted to reuse key: %r' % key) | | 139 | + raise TypeError('%r already defined as: %r' % (key, self[key])) | 140 | 140 | elif key in self._ignore: | 141 | 141 | pass | 142 | 142 | elif not _is_descriptor(value): | @@ -157,6 +157,16 @@ def __setitem__(self, key, value): | 157 | 157 | self._last_values.append(value) | 158 | 158 | super().__setitem__(key, value) | 159 | 159 |
| | 160 | + def update(self, members, **more_members): | | 161 | + try: | | 162 | + for name in members.keys(): | | 163 | + self[name] = members[name] | | 164 | + except AttributeError: | | 165 | + for name, value in members: | | 166 | + self[name] = value | | 167 | + for name, value in more_members.items(): | | 168 | + self[name] = value | | 169 | + | 160 | 170 |
| 161 | 171 | # Dummy value for Enum as EnumMeta explicitly checks for it, but of course | 162 | 172 | # until EnumMeta finishes running the first time the Enum class doesn't exist. | |
Collapse file Copy file name to clipboardExpand all lines: Lib/test/test_enum.py +28Lines changed: 28 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -2186,6 +2186,34 @@ class Strings(StrEnum): | 2186 | 2186 | self.assertEqual([Strings.ONE, Strings.TWO], ['one', 'two']) | 2187 | 2187 |
| 2188 | 2188 |
| | 2189 | + def test_dynamic_members_with_static_methods(self): | | 2190 | + # | | 2191 | + foo_defines = {'FOO_CAT': 'aloof', 'BAR_DOG': 'friendly', 'FOO_HORSE': 'big'} | | 2192 | + class Foo(Enum): | | 2193 | + vars().update({ | | 2194 | + k: v | | 2195 | + for k, v in foo_defines.items() | | 2196 | + if k.startswith('FOO_') | | 2197 | + }) | | 2198 | + def upper(self): | | 2199 | + return self.value.upper() | | 2200 | + self.assertEqual(list(Foo), [Foo.FOO_CAT, Foo.FOO_HORSE]) | | 2201 | + self.assertEqual(Foo.FOO_CAT.value, 'aloof') | | 2202 | + self.assertEqual(Foo.FOO_HORSE.upper(), 'BIG') | | 2203 | + # | | 2204 | + with self.assertRaisesRegex(TypeError, "'FOO_CAT' already defined as: 'aloof'"): | | 2205 | + class FooBar(Enum): | | 2206 | + vars().update({ | | 2207 | + k: v | | 2208 | + for k, v in foo_defines.items() | | 2209 | + if k.startswith('FOO_') | | 2210 | + }, | | 2211 | + **{'FOO_CAT': 'small'}, | | 2212 | + ) | | 2213 | + def upper(self): | | 2214 | + return self.value.upper() | | 2215 | + | | 2216 | + | 2189 | 2217 | class TestOrder(unittest.TestCase): | 2190 | 2218 |
| 2191 | 2219 | def test_same_members(self): | |
Collapse file Copy file name to clipboard +1Lines changed: 1 addition & 0 deletions - Display the source diff
- Display the rich diff
| Original file line number | Diff line number | Diff line change |
|---|
| | 1 | +[Enum] `_EnumDict.update()` is now supported |
|