如何设计可管理超10000道数学题生成模板的项目结构?
数学试题生成模板最优存储方案
核心设计思路
采用装饰器自动注册+按题型分层存储的轻量方案,完全避免大量冗余类或者单类上万方法的问题,同时支持后续平滑扩展到10000+模板。
具体实现方案
1. 实现统一注册器
用字典作为全局容器存储所有模板,通过装饰器自动完成模板注册,不需要手动维护模板列表:
import random from typing import Callable, Dict, Tuple # 全局模板注册容器,key为模板唯一ID,value为试题生成函数 question_templates: Dict[str, Callable[[int], Tuple[str, str]]] = {} # 模板注册装饰器 def register_template(template_id: str): def wrapper(func: Callable[[int], Tuple[str, str]]): question_templates[template_id] = func return func return wrapper
2. 按题型拆分模板文件
将模板按知识点、题型拆分到不同目录和文件中,单个文件最多存放几十组模板,避免文件过大难以维护,示例目录结构:
math_test_generator/ ├── core/ │ ├── __init__.py │ └── registry.py # 存放上述注册器代码 └── templates/ ├── __init__.py # 配置自动导入所有子模块的模板 ├── arithmetic/ # 四则运算题型 │ ├── add.py │ ├── subtract.py │ ├── multiply.py │ └── divide.py ├── algebra/ # 代数题型 │ ├── linear_equation.py │ └── polynomial.py └── geometry/ # 几何题型 ├── area_calculate.py └── angle_calculate.py
每个模板函数只需要加装饰器即可完成注册,示例:
# 放在templates/arithmetic/add.py中 @register_template("addition_basic") def addition_template(difficulty: int) -> Tuple[str, str]: a = random.randint(1, 10 ** difficulty) b = random.randint(1, 10 ** difficulty) return f"What is {a} + {b}?", str(a + b)
只需在templates/__init__.py中配置自动遍历导入所有子模块的代码,即可一次性完成所有模板的注册,不需要手动逐个导入。
3. 调用方式
直接从注册容器中调取模板即可生成试题,示例随机抽题逻辑:
def generate_random_question(difficulty: int) -> Tuple[str, str]: # 随机选一个模板 template_func = question_templates[random.choice(list(question_templates.keys()))] return template_func(difficulty)
方案优势
- 无冗余代码:不需要定义大量类,也不需要把所有方法塞到同一个类中,每个模板就是独立的普通函数
- 扩展性极强:新增模板只需要在对应分类的文件里加带装饰器的函数即可,不需要修改核心逻辑,10000+模板也可以按知识点分类清晰管理
- 检索灵活:可以给注册装饰器扩展标签参数,标记题型、适用学段等属性,后续可以按标签筛选指定类型的试题
- 易维护:修改单个模板的生成逻辑只会改动对应文件,不会影响其他模板的正常运行
内容的提问来源于stack exchange,提问作者aligen
相关产品推荐
相关产品推荐

