You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 06:36:03