Skip to content

Commit baf11a4

Browse files
RafaelWOSimonGPrsethanfurman
authored
gh-139398: [Enum] Add supported sunder names to __dir__ for REPL completions (GH-139985)
* Add supported sunder names to Enum `__dir__` This change adds the sunder names `_generate_next_value_` and `_missing_` to the `__dir__` method of `EnumType` and `Enum`. In Addition, The instance level sunder names `_add_alias_` and `_add_value_alias_` are added to `Enum.__dir__`. With the sunder names exposed in the `dir()` method, the REPL autocomplete will also show them. --------- Co-authored-by: SimonGPrs <107691772+SimonGPrs@users.noreply.github.com> Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
1 parent ef2246f commit baf11a4

4 files changed

Lines changed: 21 additions & 6 deletions

File tree

Doc/library/enum.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ Data types
222222
names of the members in *cls*::
223223

224224
>>> dir(Color)
225-
['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']
225+
['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__', '_generate_next_value_', '_missing_']
226226

227227
.. method:: EnumType.__getitem__(cls, name)
228228

@@ -355,7 +355,7 @@ Data types
355355
... print(f'today is {cls(dt.date.today().isoweekday()).name}')
356356
...
357357
>>> dir(Weekday.SATURDAY)
358-
['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']
358+
['__class__', '__doc__', '__eq__', '__hash__', '__module__', '_add_alias_', '_add_value_alias_', '_generate_next_value_', '_missing_', 'name', 'today', 'value']
359359

360360
.. method:: Enum._generate_next_value_(name, start, count, last_values)
361361

Lib/enum.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,8 @@ def __dir__(cls):
784784
'__class__', '__contains__', '__doc__', '__getitem__',
785785
'__iter__', '__len__', '__members__', '__module__',
786786
'__name__', '__qualname__',
787+
# Supported sunder names of Enum class
788+
'_generate_next_value_', '_missing_',
787789
]
788790
+ members
789791
)
@@ -1297,7 +1299,8 @@ def __dir__(self):
12971299
"""
12981300
Returns public methods and other interesting attributes.
12991301
"""
1300-
interesting = set()
1302+
# Initialize with supported sunder names
1303+
interesting = set(('_generate_next_value_', '_missing_', '_add_alias_', '_add_value_alias_'))
13011304
if self.__class__._member_type_ is not object:
13021305
interesting = set(object.__dir__(self))
13031306
for name in getattr(self, '__dict__', []):

Lib/test/test_enum.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5105,6 +5105,8 @@ def test_inspect_getmembers(self):
51055105
('__qualname__', 'TestStdLib.Color'),
51065106
('__init_subclass__', getattr(self.Color, '__init_subclass__')),
51075107
('__iter__', self.Color.__iter__),
5108+
('_missing_', self.Color._missing_),
5109+
('_generate_next_value_', self.Color._generate_next_value_),
51085110
))
51095111
result = dict(inspect.getmembers(self.Color))
51105112
self.assertEqual(set(values.keys()), set(result.keys()))
@@ -5147,6 +5149,10 @@ def test_inspect_classify_class_attrs(self):
51475149
defining_class=self.Color, object='Color'),
51485150
Attribute(name='__qualname__', kind='data',
51495151
defining_class=self.Color, object='TestStdLib.Color'),
5152+
Attribute(name='_missing_', kind='class method',
5153+
defining_class=Enum, object=Enum.__dict__['_missing_']),
5154+
Attribute(name='_generate_next_value_', kind='static method',
5155+
defining_class=self.Color, object=self.Color.__dict__['_generate_next_value_']),
51505156
Attribute(name='YELLOW', kind='data',
51515157
defining_class=self.Color, object=self.Color.YELLOW),
51525158
Attribute(name='MAGENTA', kind='data',
@@ -5178,11 +5184,13 @@ def test_inspect_classify_class_attrs(self):
51785184
# __doc__ is too big to check exactly, so treat the same as __init_subclass__
51795185
for name in ('name','kind','defining_class'):
51805186
if getattr(v, name) != getattr(r, name):
5181-
print('\n%s\n%s\n%s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='')
5187+
print('\n%s\nexpected: %s\nactual: %s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='')
51825188
failed = True
5189+
# breakpoint()
51835190
elif r != v:
5184-
print('\n%s\n%s\n%s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='')
5191+
print('\n%s\nexpected: %s\nactual: %s\n%s\n' % ('=' * 75, r, v, '=' * 75), sep='')
51855192
failed = True
5193+
# breakpoint()
51865194
if failed:
51875195
self.fail("result does not equal expected, see print above")
51885196

@@ -5537,6 +5545,7 @@ def enum_dir(cls):
55375545
'__class__', '__contains__', '__doc__', '__getitem__',
55385546
'__iter__', '__len__', '__members__', '__module__',
55395547
'__name__', '__qualname__',
5548+
'_generate_next_value_', '_missing_',
55405549
]
55415550
+ members
55425551
)
@@ -5552,7 +5561,8 @@ def enum_dir(cls):
55525561

55535562
def member_dir(member):
55545563
if member.__class__._member_type_ is object:
5555-
allowed = set(['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'value'])
5564+
allowed = set(['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'value',
5565+
'_generate_next_value_', '_missing_', '_add_alias_', '_add_value_alias_'])
55565566
else:
55575567
allowed = set(dir(member))
55585568
for cls in member.__class__.mro():
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Add supported ``_sunder_`` names to the :func:`dir` method of the :mod:`enum` module
2+
to support them in :term:`REPL` autocompletion.

0 commit comments

Comments
 (0)