Python不使用全局变量实现链式调用函数组合的方案是什么
解决方案
完全可以将链式调用产生的函数列表存储在Expr类的实例内部属性中,彻底摒弃全局容器,避免多并发调用、重复调用导致的数据污染问题,修改后的实现如下:
class Expr: def __init__(self, f=None, prev_funcs=None): # 存储当前链式调用累积的所有运算函数 self.funcs = prev_funcs.copy() if prev_funcs else [] if f: self.funcs.append(f) # 运算方法改为实例方法,追加新函数后返回新Expr实例 def add(self, y): return Expr(lambda x: x + y, self.funcs) def mul(self, y): return Expr(lambda x: x * y, self.funcs) def sub(self, y): return Expr(lambda x: x - y, self.funcs) def div(self, y): return Expr(lambda x: x / y, self.funcs) # 快捷调用封装保持不变 def mul(y): return Expr(lambda x: x*y) def add(y): return Expr(lambda x: x+y) def sub(y): return Expr(lambda x: x-y) def div(y): return Expr(lambda x: x/y) # 函数组合逻辑保持不变 def composer(*functions): def inner_func(arg): for f in reversed(functions): arg = f(arg) return arg return inner_func def collect(el, expr: Expr): try: # 直接读取实例内存储的函数列表即可 f = composer(*expr.funcs) return f(el) except: print("Upps, something went wrong") # 测试调用 print(collect(10, mul(3).div(2).add(10))) # 输出结果为25.0
核心改动说明
- 移除全局
container变量,给Expr新增funcs实例属性,专门存储当前链式调用累积的所有运算函数,不同链式调用的存储完全隔离,不会互相干扰 - 每次调用
add/mul等运算方法时,会基于已有的函数列表追加新的运算函数,返回新的Expr实例,生命周期和实例绑定,不需要手动清空存储 collect函数直接读取传入Expr实例的内部函数列表即可生成组合函数,不需要操作全局变量,逻辑更简洁可靠
内容的提问来源于stack exchange,提问作者FredMaster
相关产品推荐
相关产品推荐

