Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 354ecf1

Browse files
committed
Close issue23486: performance boost for enum member lookup
1 parent ca8b644 commit 354ecf1

1 file changed

Lines changed: 10 additions & 1 deletion

File tree

Lib/enum.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ def __new__(metacls, cls, bases, classdict):
112112
enum_class._member_map_ = OrderedDict() # name->value map
113113
enum_class._member_type_ = member_type
114114

115+
# save attributes from super classes so we know if we can take
116+
# the shortcut of storing members in the class dict
117+
base_attributes = {a for b in bases for a in b.__dict__}
118+
115119
# Reverse value->name map for hashable values.
116120
enum_class._value2member_map_ = {}
117121

@@ -165,6 +169,11 @@ def __new__(metacls, cls, bases, classdict):
165169
else:
166170
# Aliases don't appear in member names (only in __members__).
167171
enum_class._member_names_.append(member_name)
172+
# performance boost for any member that would not shadow
173+
# a DynamicClassAttribute
174+
if member_name not in base_attributes:
175+
setattr(enum_class, member_name, enum_member)
176+
# now add to _member_map_
168177
enum_class._member_map_[member_name] = enum_member
169178
try:
170179
# This may fail if value is not hashable. We can't add the value
@@ -468,7 +477,7 @@ def __dir__(self):
468477
m
469478
for cls in self.__class__.mro()
470479
for m in cls.__dict__
471-
if m[0] != '_'
480+
if m[0] != '_' and m not in self._member_map_
472481
]
473482
return (['__class__', '__doc__', '__module__'] + added_behavior)
474483

0 commit comments

Comments
 (0)