第 2 周周测(闭卷,40 分钟,20 题)¶
不开 REPL、不开 AI。答案见
exercises/solutions/week2/quiz_week2_answers.md。≥16 分通过;错题进下周一的回忆清单。
一、预测输出(10 题)¶
python from pydantic import BaseModel, Field class Item(BaseModel): name: str = Field(min_length=1) qty: int = Field(gt=0) tags: list[str] = [] i = Item(name="a", qty="3") print(i.qty, type(i.qty).__name__) a = Item(name="a", qty=1); b = Item(name="b", qty=1) a.tags.append("x"); print(b.tags)python from pydantic import ValidationError try: Item(name="", qty=0, extra=1) except ValidationError as e: print(len(e.errors()), [err["loc"] for err in e.errors()])追问:怎样让extra=1也报错?python schema = Item.model_json_schema() print(schema["required"], schema["properties"]["qty"].get("exclusiveMinimum"))python print(Item(name="a", qty=2).model_dump(mode="json"))追问:如果字段里有datetime,model_dump()与model_dump(mode="json")的区别是什么?python import re m = re.search(r"(?P<y>\d{4})-(?P<m>\d{2})", "日期 2026-09-14 和 2026-10-01") print(m.group("y"), m.groupdict(), re.findall(r"\d{4}-\d{2}", "2026-09-14 2026-10-01"))python print(re.sub(r"a.*b", "X", "a1b2b"), re.sub(r"a.*?b", "X", "a1b2b"), re.match(r"b", "ab"))python import logging logger = logging.getLogger("kb.service") print(logger.name, logger.parent.name, logger.level, logger.getEffectiveLevel())python import sqlite3 conn = sqlite3.connect(":memory:") conn.execute("CREATE TABLE t (id INTEGER PRIMARY KEY, v TEXT)") with conn: conn.execute("INSERT INTO t (v) VALUES (?)", ("a",)) try: with conn: conn.execute("INSERT INTO t (v) VALUES (?)", ("b",)) raise ValueError("boom") except ValueError: pass print(conn.execute("SELECT count(*) FROM t").fetchone()[0])python import json print(json.dumps({"名": "值"})) print(json.dumps({"名": "值"}, ensure_ascii=False))python from pydantic import TypeAdapter ta = TypeAdapter(list[int]) print(ta.validate_python(["1", 2]), ta.validate_json("[3, 4]"))
二、找 bug(5 题)¶
python # src/kb/repository.py def search(self, pattern): return self.conn.execute(f"SELECT * FROM notes WHERE title LIKE '%{pattern}%'").fetchall()python # kb/models.py import logging logging.basicConfig(level=logging.DEBUG) # 在库模块顶部 logger = logging.getLogger(__name__)python class Settings(BaseSettings): api_key: str = "sk-live-123456" # 默认值并且.env被git add了。python with open(path, "w") as f: json.dump(notes, f)(在中文 Windows 上会有什么问题?导出中途崩溃又会怎样?)python from typing import Optional class Note(BaseModel): body: Optional[str] Note(title="t") # 假设 title 已定义期望body可以省略。
三、写代码(5 题)¶
- 写 Pydantic 模型
Task:title(1–50 字,去首尾空白)、priority: Literal["low", "high"] = "low"、tags: list[str]默认空且自动小写去重;due: datetime | None = None;加一个@model_validator(mode="after"):priority == "high"时due不能为None。 - 写
setup_logging(level: str, log_file: Path | None):控制台 handler + 可选 UTF-8 文件 handler,重复调用不重复添加 handler;说明为什么库代码里不该调用它。 - 写正则函数
parse_log_line(line) -> dict | None,解析2026-09-14 12:00:01 [ERROR] kb.service: 消息文本为{"time", "level", "logger", "message"}(命名分组,re.VERBOSE)。 - 写
SqliteRepo.add(title: str) -> int:参数化插入、with conn:事务、返回新 id;再写幂等的migrate(conn)。 - 画出(文字版)一个 src 布局的包:
pyproject.toml中[project.scripts]让uv run kb可用;说出uv run kb、python -m kb、python src/kb/cli.py三种运行方式哪一种会失败以及为什么。