如何从__init__.py自动生成Python类工厂feature_expander_factory
自动生成feature_expander_factory字典
当前手动维护feature_expander_factory字典(用于将类名映射到对应类)效率极低——类名变更或新增类时,都得手动修改字典。现在需要从给定的__init__.py文件中自动提取所有类,生成该字典,其中StrToListToColumns对应的键为ListToColumns,其余类直接用自身类名作为键映射到类本身。
原手动实现示例
from data_processing.feature_expanders import ( CategoricalToOneHot, RFMSplitter, RFMSplitterAndOneHot, StrToListToColumns, ) feature_expander_factory = dict( CategoricalToOneHot=CategoricalToOneHot, RFMSplitter=RFMSplitter, RFMSplitterAndOneHot=RFMSplitterAndOneHot, ListToColumns=StrToListToColumns, )
给定的__init__.py内容
from data_processing.feature_expanders.AbstractFeatureExpander import AbstractFeatureExpander from data_processing.feature_expanders.CategoricalToOneHot import CategoricalToOneHot from data_processing.feature_expanders.RFMSplitter import RFMSplitter from data_processing.feature_expanders.RFMSplitterAndOneHot import RFMSplitterAndOneHot from data_processing.feature_expanders.StrToListToColumns import StrToListToColumns
自动生成方案
直接通过模块导入后遍历成员,自动构建字典,无需手动维护:
import data_processing.feature_expanders as feature_expanders_module # 定义特殊类名映射规则 special_name_mapping = { "StrToListToColumns": "ListToColumns" } feature_expander_factory = {} # 遍历模块中的所有成员,筛选出需要的类(排除抽象基类) for class_name, class_obj in vars(feature_expanders_module).items(): # 只处理类,且跳过AbstractFeatureExpander if isinstance(class_obj, type) and class_name != "AbstractFeatureExpander": # 应用特殊映射,否则使用原类名作为键 dict_key = special_name_mapping.get(class_name, class_name) feature_expander_factory[dict_key] = class_obj
方案说明
- 无需手动添加或修改字典条目,
__init__.py中新增/修改导入的类时,字典会自动同步 - 通过
vars()获取模块的所有成员,筛选出类类型的对象 - 用
special_name_mapping处理特殊的类名映射需求,后续有其他特殊规则只需修改这个字典即可
内容的提问来源于stack exchange,提问作者Gooby
相关产品推荐
相关产品推荐

