调用Python函数计算KPI时如何存储所需字段并过滤字典冗余?
实现方案
用装饰器给函数打依赖标记是最简洁的实现方式,完全满足你的需求:无需封装类、对普通调用用户无感知、可批量统计多个KPI的字段依赖前置过滤。
1. 定义依赖标记装饰器
def requires(*fields): def decorator(func): # 给函数绑定依赖字段属性 func.__requires__ = set(fields) return func return decorator
2. 给KPI函数标记依赖
直接在函数定义上方加装饰器即可,无需额外封装内部函数,用户调用时和普通函数完全一致:
@requires('A') def foo(data): # KPI计算逻辑,使用字段A return data['A'] * 100 @requires('B', 'C') def bar(data): # KPI计算逻辑,使用字段B、C return data['B'] / data['C']
3. 批量获取依赖字段+过滤数据
def get_required_fields(func_list: list) -> set: """批量获取多个函数依赖的所有字段,自动去重""" required = set() for func in func_list: required.update(getattr(func, '__requires__', set())) return required # 调用示例 kpis_to_calculate = [foo, bar] needed_fields = get_required_fields(kpis_to_calculate) # 场景1:读数据阶段就只加载需要的字段,完全不读取无用字段 min_data = load(data_src, required_fields=needed_fields) # 场景2:已拿到全量大字典,过滤出需要的字段 full_data = {"A": 1, "B": 2, "C": 3, "D": 4, "E":5} filtered_data = {k: v for k, v in full_data.items() if k in needed_fields}
可选增强:自动校验字段存在
如果需要避免用户调用函数时传入的字典缺字段,可以给装饰器加校验逻辑,调用时自动检查字段是否齐全,缺字段直接抛出明确报错:
def requires(*fields, validate: bool = True): def decorator(func): func.__requires__ = set(fields) if not validate: return func def wrapper(data, *args, **kwargs): missing_fields = func.__requires__ - data.keys() if missing_fields: raise ValueError(f"函数{func.__name__}缺少必须字段:{', '.join(missing_fields)}") return func(data, *args, **kwargs) return wrapper return decorator
方案优势
- 无侵入:普通用户直接调用KPI函数即可,不需要感知任何额外逻辑,不需要实例化类
- 易维护:依赖字段直接声明在函数定义头部,不用翻函数内部代码就能知道所需字段
- 灵活性高:既支持单个函数独立调用,也支持批量统计依赖做前置过滤,适配你两种使用场景
- 可扩展性强:可以基于装饰器扩展字段类型校验、默认值填充等额外能力
内容的提问来源于stack exchange,提问作者Sreenath Raparti
相关产品推荐
相关产品推荐

