# 用户故事示例
# 作为一名学生,我希望输入课程分数,自动计算绩点并导出报告。
from dataclasses import dataclass
from typing import List, Dict
@dataclass
class Course:
name: str
score: float
@dataclass
class Student:
id: int
name: str
courses: List[Course]
def gpa(self) -> float:
if not self.courses:
return 0.0
return sum(c.score for c in self.courses) / len(self.courses)
project/
app/ # 业务代码
__init__.py
models.py
services.py
cli.py # 命令行入口
tests/ # 单元测试
test_models.py
data/ # 输入输出数据
requirements.txt
README.md
import argparse
def build_parser() -> argparse.ArgumentParser:
p = argparse.ArgumentParser(prog="grader", description="成绩工具")
sub = p.add_subparsers(dest="cmd", required=True)
p_load = sub.add_parser("load")
p_load.add_argument("file", help="CSV文件")
p_report = sub.add_parser("report")
p_report.add_argument("--top", type=int, default=10)
return p
if __name__ == "__main__":
args = build_parser().parse_args()
if args.cmd == "load":
print("loading", args.file)
elif args.cmd == "report":
print("top", args.top)
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(name)s: %(message)s",
)
logger = logging.getLogger("project")
logger.info("启动应用")
import csv, json
# CSV读取
with open("data/students.csv", newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
rows = list(reader)
# JSON写入
with open("data/report.json", "w", encoding="utf-8") as f:
json.dump(rows, f, ensure_ascii=False, indent=2)
import sqlite3
conn = sqlite3.connect("data/app.db")
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS student(id INTEGER PRIMARY KEY, name TEXT)")
cur.execute("INSERT INTO student(name) VALUES (?)", ("Alice",))
conn.commit()
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
session.headers.update({"User-Agent": "CS106A/1.0"})
retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504])
session.mount("https://", HTTPAdapter(max_retries=retry))
resp = session.get("https://httpbin.org/json", timeout=5)
resp.raise_for_status()
print(resp.json())
class StudentRepository:
def __init__(self):
self._students = {}
def add(self, student):
self._students[student.id] = student
def get(self, student_id):
return self._students.get(student_id)
class ReportService:
def __init__(self, repo: StudentRepository):
self.repo = repo
def topk(self, k: int):
data = list(self.repo._students.values())
return sorted(data, key=lambda s: s.gpa(), reverse=True)[:k]
import unittest
class TestGpa(unittest.TestCase):
def test_empty(self):
s = Student(id=1, name="A", courses=[])
self.assertEqual(s.gpa(), 0.0)
# if __name__ == "__main__":
# unittest.main()
def safe_div(x: float, y: float) -> float:
if y == 0:
raise ValueError("denominator must not be zero")
return x / y
try:
safe_div(1, 0)
except ValueError as e:
logger.error("invalid input: %s", e)
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
urls = ["https://httpbin.org/delay/1" for _ in range(5)]
def fetch(u):
return requests.get(u, timeout=3).status_code
with ThreadPoolExecutor(max_workers=5) as ex:
futures = [ex.submit(fetch, u) for u in urls]
print([f.result() for f in as_completed(futures)])
# 约定README中给出调用示例
# python -m app.cli load data/students.csv
# python -m app.cli report --top 10
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, Project!"
# if __name__ == "__main__":
# app.run(debug=True)
# 读取CSV -> 计算统计 -> 生成JSON -> 前端/命令行展示
# 天气 + 翻译 + 汇率:统一封装 + 缓存 + 限流与重试
提交包含用户故事、用例、数据模型与模块划分的设计文档(1-2页)。
实现核心功能,包含至少3个单元测试与日志;README给出运行与演示说明。
录制1-3分钟演示视频或现场演示,附问题与改进清单。