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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:06:03