
12.03.21 23:48, Ethan Furman пише:
A question that comes up quite a bit on Stackoverflow is how to test to see if a value will result in an Enum member, preferably without having to go through the whole try/except machinery.
A couple versions ago one could use a containment check:
if 1 in Color:
but than was removed as Enums are considered containers of members, not containers of the member values. It was also possible to define one's own `_missing_` method and have it return None or the value passed in, but that has also been locked down to either return a member or raise an exception.
At this point I see three options:
1) add a `get(value, default=None)` to EnumMeta (similar to `dict.get()`
2) add a recipe to the docs
3) do nothing
Thoughts?
The Enum class is already too overloaded. I sometimes think about adding SimpleEnum class with minimal simple functionality which would allow to use enums in more modules sensitive to import time. As for solving your problem, try/except looks the best solution to me. try: Color(1) except ValueError: ... # invalid color else: ... # valid color If you don't like try/except, the second best solution is to add a module level helper in the enum module: def find_by_value(cls, value, default=None): try: return cls(value) except ValueError: return default You can add also find_all_by_value(), get_aliases(), etc. It is important that they are module-level function, so they do not spoil the namespace of the Enum class.