如何过滤掉枚举子类?



在模块的末尾,我想获取模块中定义的类并向类添加一些属性。 (属性值是根据其他类属性计算的;我想避免在每个类定义中重复代码。我在这里找到了有关如何获取模块中定义的类列表的指南。

classmembers = inspect.getmembers(
sys.modules[__name__], 
lambda member: inspect.isclass(member) and member.__module__ == __name__
)

但是如果我在模块中定义了一个 Enum 子类,我想过滤掉它。我尝试了以下方法,但没有用:

classmembers = inspect.getmembers(
sys.modules[__name__], 
lambda member: inspect.isclass(member) and member.__module__ == __name__
and not isinstance(member,  Enum)
)

我暂时用这个检查结果列表

for c in classmembers:
print(c)

枚举继续出现。

...
('VarFWord', <class 'table_COLR_new.VarFWord'>)
('VarFixed', <class 'table_COLR_new.VarFixed'>)
('VarUFWord', <class 'table_COLR_new.VarUFWord'>)
('extend', <enum 'extend'>)

为什么会这样?我需要更改什么才能过滤掉枚举?

我想出了一个答案。这有点出乎意料:没想到类型foo可以是 bar 的子类但不是bar 的实例

所以,而不是

classmembers = inspect.getmembers(
sys.modules[__name__], 
lambda member: inspect.isclass(member) and member.__module__ == __name__
and not isinstance(member,  Enum)
)

我只需要改成这个:

classmembers = inspect.getmembers(
sys.modules[__name__], 
lambda member: (inspect.isclass(member) 
and member.__module__ == __name__
and not issubclass(member,  Enum))
)

最新更新