|
1 | | -"""Python Enumerations""" |
2 | | - |
3 | 1 | import sys |
4 | 2 | from collections import OrderedDict |
5 | 3 | from types import MappingProxyType |
@@ -154,11 +152,13 @@ def __new__(metacls, cls, bases, classdict): |
154 | 152 | args = (args, ) # wrap it one more time |
155 | 153 | if not use_args: |
156 | 154 | enum_member = __new__(enum_class) |
157 | | - enum_member._value = value |
| 155 | + original_value = value |
158 | 156 | else: |
159 | 157 | enum_member = __new__(enum_class, *args) |
160 | | - if not hasattr(enum_member, '_value'): |
161 | | - enum_member._value = member_type(*args) |
| 158 | + original_value = member_type(*args) |
| 159 | + if not hasattr(enum_member, '_value'): |
| 160 | + enum_member._value = original_value |
| 161 | + value = enum_member._value |
162 | 162 | enum_member._member_type = member_type |
163 | 163 | enum_member._name = member_name |
164 | 164 | enum_member.__init__(*args) |
@@ -416,12 +416,14 @@ def __new__(cls, value): |
416 | 416 | return value |
417 | 417 | # by-value search for a matching enum member |
418 | 418 | # see if it's in the reverse mapping (for hashable values) |
419 | | - if value in cls._value2member_map: |
420 | | - return cls._value2member_map[value] |
421 | | - # not there, now do long search -- O(n) behavior |
422 | | - for member in cls._member_map.values(): |
423 | | - if member.value == value: |
424 | | - return member |
| 419 | + try: |
| 420 | + if value in cls._value2member_map: |
| 421 | + return cls._value2member_map[value] |
| 422 | + except TypeError: |
| 423 | + # not there, now do long search -- O(n) behavior |
| 424 | + for member in cls._member_map.values(): |
| 425 | + if member.value == value: |
| 426 | + return member |
425 | 427 | raise ValueError("%s is not a valid %s" % (value, cls.__name__)) |
426 | 428 |
|
427 | 429 | def __repr__(self): |
|
0 commit comments