Repository navigation
Closed
Labels
3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
| BPO | 45535 |
|---|---|
| Nosy | @warsaw, @ethanfurman, @serhiy-storchaka, @AlexWaygood |
| PRs | dir() #29316 |
| Superseder | |
| Files |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee = 'https://github.com/ethanfurman'
closed_at = <Date 2022-01-17.17:02:11.779>
created_at = <Date 2021-10-20.10:35:06.095>
labels = ['type-bug', 'library', '3.10', '3.11']
title = "Enum's dir() does not contain inherited members"
updated_at = <Date 2022-01-18.23:13:23.710>
user = 'https://github.com/serhiy-storchaka'bugs.python.org fields:
activity = <Date 2022-01-18.23:13:23.710>
actor = 'ethan.furman'
assignee = 'ethan.furman'
closed = True
closed_date = <Date 2022-01-17.17:02:11.779>
closer = 'ethan.furman'
components = ['Library (Lib)']
creation = <Date 2021-10-20.10:35:06.095>
creator = 'serhiy.storchaka'
dependencies = []
files = ['50382', '50383']
hgrepos = []
issue_num = 45535
keywords = ['patch']
message_count = 11.0
messages = ['404420', '404621', '404634', '404635', '404721', '405313', '405320', '405323', '407539', '410807', '410912']
nosy_count = 5.0
nosy_names = ['barry', 'eli.bendersky', 'ethan.furman', 'serhiy.storchaka', 'AlexWaygood']
pr_nums = ['29316', '30677']
priority = 'normal'
resolution = 'fixed'
stage = 'resolved'
status = 'closed'
superseder = '40066'
type = 'behavior'
url = 'https://bugs.python.org/issue45535'
versions = ['Python 3.10', 'Python 3.11']Metadata
Metadata
Assignees
Labels
3.10 (EOL)end of lifeend of life3.11only security fixesonly security fixesstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Activity
serhiy-storchaka commentedon Oct 20, 2021
For example:
There are methods and attributes inherited from int, but they are not shown in dir(). As result they are absent in help() and completion does not work for them.
AlexWaygood commentedon Oct 21, 2021
I had a go at writing a patch for
__dir__that would include any methods an enum class had acquired throughint/str/etc. mixins, while continuing to ignore enum dunders and sunders (as is currently the case). My patch also allows user-defined methods defined in enum subclasses to show up in thehelp()output, whereas they currently do not, sincehelp(enum_member)looks updir(enum_class)rather thandir(enum_member).The patch is a fair way more complex than the the existing code, however.
ethanfurman commentedon Oct 21, 2021
Looks interesting, thank you for the patch.
serhiy-storchaka commentedon Oct 21, 2021
There may be a simple error (superfluous .__class__), but I am not sure.
BTW, why use mro() instead of __mro__? Most code use __mro__.
AlexWaygood commentedon Oct 22, 2021
Would there be interest in me submitting a PR along these lines?
----
Er, no reason, really. To be honest, I've never really understood why Python has both.
serhiy-storchaka commentedon Oct 29, 2021
PR 29316 looks complicated.
First of all, why do Enum needs a custom __dir__? What is wrong with the default implementation?
ethanfurman commentedon Oct 29, 2021
Enums have had a custom dir() from the beginning, partly because they are not standard objects and do not follow standard rules.
The question posed by this issue is whether Enums with mixed-in data types should show the inherited methods, and if yes, should it also show inherited
__dunders__.I'm inclined to say yes for the normal inherited methods, I'm not sure about inherited
__dunders__.AlexWaygood commentedon Oct 29, 2021
I would argue it's quite important for
IntEnumto have the dunder methods inherited fromintshow up inhelp(). Dunder methods indicate that an object has certain behaviours, so it's important for a user to be able to verify that anIntEnummember has similar behaviours to anintinstance.IntEnumis advertised in the documentation as something that can be used everywhere where an integer is expected; it's surprising when the output fromhelp()is hugely abbreviated forIntEnumrelative toint.But, I agree that my first draft of this PR is more complex than I'd like it to be.
ethanfurman commentedon Dec 2, 2021
New changeset b2afdc9 by Alex Waygood in branch 'main':
bpo-45535: Improve output of Enum
dir()(GH-29316)b2afdc9
ethanfurman commentedon Jan 17, 2022
Fixed in 3.11.
Pure enums have a few more dir() entries now; mixed enums now show all inherited methods/attributes -- members still do not show up in member dirs (this is a good thing).
ethanfurman commentedon Jan 18, 2022
New changeset 7c0914d by Ethan Furman in branch 'main':
bpo-45535: [Enum] include special dunders in dir() (GH-30677)
7c0914d
vstinner commentedon Oct 2, 2025
@ethanfurman: test_enum.test_dir_with_custom_dunders() is skipped since 2022, since commit 7c0914d:
What's the status of this test? Should it be removed?