函数工厂是返回函数的函数,通过闭包将参数固化为新函数的自由变量,实现行为定制与状态隔离。它用“函数套函数”自然结构替代字符串拼接或ast构建,轻量、安全、可调试。

函数工厂是闭包最典型、最实用的落地方式——它不靠字符串拼接或 AST 构建,而是用“函数套函数”的自然结构,把配置固化进新函数的行为里。
什么是函数工厂
函数工厂是一个返回函数的函数。它接收参数(如初始值、乘数、字段名等),在内部定义并返回一个新函数;这个新函数能持续访问工厂函数作用域里的变量,哪怕工厂已执行完毕。
关键不在“嵌套”,而在“返回”和“引用”:外部函数必须返回内部函数,且内部函数必须实际使用外部函数的局部变量(即自由变量)。
为什么适合代码生成
生成代码的本质,是把重复逻辑模板化,再注入差异化参数。函数工厂恰好完成这件事:
- 模板逻辑写在内部函数里,只写一次
- 差异参数(如 state、type、expr_type)由工厂函数接收并绑定
- 每次调用工厂,就产出一个专属函数,彼此状态隔离
比如批量生成请求构造函数:generateReqByState、generateReqByOrderType,底层共用同一段组装逻辑,仅字段名和取值列表不同——这正是函数工厂的强项。
怎么写一个安全可用的函数工厂
避免常见陷阱,核心是两点:变量绑定要明确,作用域要干净。
- 用默认参数捕获当前值,防止循环中闭包共享同一变量(如
for i in range(3): funcs.append(lambda x=i: x)) - 工厂函数内尽量只做参数接收和函数定义,不混杂复杂计算或副作用
- 返回的函数应有清晰职责,比如只负责数据构造,不负责网络请求或文件写入
示例:生成带固定倍率的乘法器
def make_multiplier(factor):return lambda x: x * factor
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15
和其它代码生成方式的区别
相比 exec 或模板引擎,函数工厂更轻量、更安全、更易调试:
-
exec执行字符串代码,有注入风险,IDE 难以补全和跳转 - 模板引擎适合生成文本文件(如 HTML、SQL),不适合生成运行时可调用的函数
- 函数工厂生成的是原生 Python 函数对象,类型检查友好,性能无额外开销
它不是“生成源码”,而是“生成行为”——把配置编译进函数对象本身。











