Python题库开发:向SQLite查询传入多组分值参数及OOP构造器使用
实现多参数抽题的OOP代码修改方案
核心修改点
- 用Python可变位置参数
*args接收任意多组[抽题数量, 分值]参数,满足单次调用多分值抽题需求 - 修正原有代码SQL参数顺序颠倒的bug(原代码误将抽题数量作为分值筛选条件、分值作为limit限制)
- 用SQLite参数化查询替代字符串拼接,避免SQL注入风险
- 完整封装为类,构造器用于初始化数据库连接配置,符合OOP设计规范
完整可运行代码
import sqlite3 class QuizGenerator: # 构造器:初始化数据库路径,支持自定义数据库文件 def __init__(self, db_path: str = "QuizApp.DB"): self.db_path = db_path # 初始化存储试卷的变量 self._quizpaper = {} def formulate(self, *quiz_params: list) -> dict: """ 接收任意多组[抽题数量, 分值]参数,返回随机抽取的试题集合 示例调用:formulate([2,3], [4,5], [1,10]) 代表抽2道3分、4道5分、1道10分题 """ conn = sqlite3.connect(self.db_path) cur = conn.cursor() # 清空上一次生成的试卷 self._quizpaper.clear() for count, marks in quiz_params: # 参数化查询,避免SQL注入 sql_query = "SELECT id, key FROM questions WHERE marks = ? ORDER BY RANDOM() LIMIT ?" cur.execute(sql_query, (marks, count)) questions = cur.fetchall() # 把当前分值的试题合并到总试卷字典 for q_id, q_key in questions: self._quizpaper[q_id] = q_key conn.close() return self._quizpaper # 调用示例 if __name__ == "__main__": # 实例化抽题器,构造器自动加载默认数据库 quiz_maker = QuizGenerator() # 多组分值参数调用 result = quiz_maker.formulate([2,3], [4,5], [1,10]) # 输出所有抽到的试题 格式为{题ID: 题key} print(result)
扩展说明
如果需要按分值分组返回试题,仅需修改formulate方法的存储逻辑,将self._quizpaper初始化为嵌套字典,以分值为第一层key即可。
内容的提问来源于stack exchange,提问作者NotaStar
相关产品推荐
相关产品推荐

