Python中多产品差异化参数配置的结构化存储及调用方案
解决方案
你当前的需求是批量管理上百个产品的价格运算配置,还要支持迭代调用,原来用后缀区分变量的方式完全无法支撑规模化维护,下面是符合Python最佳实践的实现方案:
优先推荐:通用数据类+集中配置管理
不要给每个产品单独定义类,上百个产品要维护上百份类代码完全不现实,你可以先定义一个通用的配置数据类,所有产品都复用这个类生成实例,再把所有实例集中放在列表/字典里统一管理即可。
实现代码示例
from dataclasses import dataclass import pandas as pd from typing import List, Optional, Union, Callable # 定义通用的产品价格配置类,所有产品复用 @dataclass class ProductPriceConfig: product_id: Union[int, str] factors: List[str] operations: List[Optional[str]] custom_functions: List[Optional[Union[str, Callable]]] rounding: List[Optional[bool]] rounding_decimals: List[Optional[int]] # 把生成运算配置表的逻辑封装到类内部,避免重复写代码 def get_operation_summary(self) -> pd.DataFrame: # 可以在这里加配置校验,比如检查各列表长度是否和factors一致,避免配置错误 if len(self.operations) != len(self.factors): raise ValueError(f"产品{self.product_id}的运算配置长度和因子数量不匹配") return pd.DataFrame( list(zip(self.operations, self.custom_functions, self.rounding, self.rounding_decimals)), index=self.factors, columns=['operation', 'custom_functions', 'rounding', 'rounding_decimals'] ) # 所有产品的配置集中存放在列表里,新增产品直接往里面加条目即可 all_product_configs = [ # 产品1配置 ProductPriceConfig( product_id=1, factors=['BaseAmount','Factor1','Factor2','Factor3','Factor4','Factor5'], operations=[None,'x','x','x','x','+'], custom_functions=[None,None,None,None,'custom_function_1(df, 0.15)',None], rounding=[None,False,True,True,False,True], rounding_decimals=[None,None,1,0,None,0] ), # 产品2配置 ProductPriceConfig( product_id=2, factors=['BaseAmount','Factor1','Factor6','Factor5','Factor7'], operations=[None,'x','x','+','+'], custom_functions=[None,None,None,'custom_function_2(df, 0.15)',None], rounding=[None,False,True,True,True], rounding_decimals=[None,None,0,0,0] ) # 其他上百个产品的配置直接往后面加就行 ]
迭代调用方式
你要批量处理所有产品的时候直接遍历配置列表即可:
for config in all_product_configs: print(f"正在处理产品{config.product_id}") op_summary = config.get_operation_summary() # 这里直接调用你原来写的通用价格优化函数,传入配置即可 # your_price_optimize_func(op_summary, ...)
扩展方案:配置文件化管理
如果后续需要非技术人员维护配置,还可以把所有配置存到YAML/JSON/CSV文件里,程序启动时统一加载生成配置实例,不需要修改代码就能新增/修改产品配置。
以YAML配置为例,配置文件内容如下:
- product_id: 1 factors: ["BaseAmount","Factor1","Factor2","Factor3","Factor4","Factor5"] operations: [null,"x","x","x","x","+"] custom_functions: [null,null,null,null,"custom_function_1(df, 0.15)",null] rounding: [null,false,true,true,false,true] rounding_decimals: [null,null,1,0,null,0] - product_id: 2 factors: ["BaseAmount","Factor1","Factor6","Factor5","Factor7"] operations: [null,"x","x","+","+"] custom_functions: [null,null,null,"custom_function_2(df, 0.15)",null] rounding: [null,false,true,true,true] rounding_decimals: [null,null,0,0,0]
加载代码示例:
import yaml with open("product_configs.yaml", "r", encoding="utf-8") as f: config_raw_list = yaml.safe_load(f) all_product_configs = [ProductPriceConfig(**config_raw) for config_raw in config_raw_list]
原有写法的问题说明
你之前设想的每个产品单独写一个类的方案可维护性极差,上百个产品就要写上百个类,后续要修改配置字段需要改动所有类,完全不符合代码复用原则。另外你写的product_1.self.factors 是语法错误,类需要先实例化,正确写法是product_1().factors。
内容的提问来源于stack exchange,提问作者DarknessFalls
相关产品推荐
相关产品推荐

