如何更优地判断Enum类型是否为IntEnum或IntFlag?
优化Enum类型判断:判断是否为IntEnum/IntFlag的更优方法
你原来通过遍历mro()判断类型的方式可以简化,Python提供了更直接高效的issubclass()函数,不用手动遍历继承链。
直接用issubclass(ec, (IntEnum, IntFlag))就能一次性判断ec是否是这两个类型(或它们的子类),代码更简洁且逻辑更严谨。
优化后的代码
from enum import Enum, IntEnum, IntFlag from typing import Type def enum_from_string(s: str, ec: Type[Enum]) -> Enum: if not s: raise ValueError("from_str arg s cannot be an empty value") try: return getattr(ec, s.upper()) except AttributeError: pass # 更简洁的类型判断逻辑 if issubclass(ec, (IntEnum, IntFlag)): try: return ec(int(s)) except ValueError: pass try: return ec(int(s, 16)) except ValueError: pass # 后续处理逻辑...
优势说明
- 代码更简洁:无需手动遍历方法解析顺序(
mro()),可读性更强 - 兼容性更好:自动处理继承关系,哪怕你的枚举是
IntEnum/IntFlag的自定义子类,判断依然有效(原代码用is判断的话,这类场景会失效) - 性能更优:省去循环遍历的额外开销
你的示例代码依然可以正常运行,比如LayoutKind.from_str("3")会正确返回LayoutKind.TITLE_2CONTENT。
内容的提问来源于stack exchange,提问作者Amour Spirit
相关产品推荐
相关产品推荐

