跳转至

第 2 周周测(闭卷,40 分钟,20 题)

不开 REPL、不开 AI。答案见 exercises/solutions/week2/quiz_week2_answers.md。≥16 分通过;错题进下周一的回忆清单。

一、预测输出(10 题)

  1. 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)
  2. 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 也报错?
  3. python schema = Item.model_json_schema() print(schema["required"], schema["properties"]["qty"].get("exclusiveMinimum"))
  4. python print(Item(name="a", qty=2).model_dump(mode="json")) 追问:如果字段里有 datetimemodel_dump()model_dump(mode="json") 的区别是什么?
  5. 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"))
  6. python print(re.sub(r"a.*b", "X", "a1b2b"), re.sub(r"a.*?b", "X", "a1b2b"), re.match(r"b", "ab"))
  7. python import logging logger = logging.getLogger("kb.service") print(logger.name, logger.parent.name, logger.level, logger.getEffectiveLevel())
  8. 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])
  9. python import json print(json.dumps({"名": "值"})) print(json.dumps({"名": "值"}, ensure_ascii=False))
  10. python from pydantic import TypeAdapter ta = TypeAdapter(list[int]) print(ta.validate_python(["1", 2]), ta.validate_json("[3, 4]"))

二、找 bug(5 题)

  1. python # src/kb/repository.py def search(self, pattern): return self.conn.execute(f"SELECT * FROM notes WHERE title LIKE '%{pattern}%'").fetchall()
  2. python # kb/models.py import logging logging.basicConfig(level=logging.DEBUG) # 在库模块顶部 logger = logging.getLogger(__name__)
  3. python class Settings(BaseSettings): api_key: str = "sk-live-123456" # 默认值 并且 .envgit add 了。
  4. python with open(path, "w") as f: json.dump(notes, f) (在中文 Windows 上会有什么问题?导出中途崩溃又会怎样?)
  5. python from typing import Optional class Note(BaseModel): body: Optional[str] Note(title="t") # 假设 title 已定义 期望 body 可以省略。

三、写代码(5 题)

  1. 写 Pydantic 模型 Tasktitle(1–50 字,去首尾空白)、priority: Literal["low", "high"] = "low"tags: list[str] 默认空且自动小写去重;due: datetime | None = None;加一个 @model_validator(mode="after")priority == "high"due 不能为 None
  2. setup_logging(level: str, log_file: Path | None):控制台 handler + 可选 UTF-8 文件 handler,重复调用不重复添加 handler;说明为什么库代码里不该调用它。
  3. 写正则函数 parse_log_line(line) -> dict | None,解析 2026-09-14 12:00:01 [ERROR] kb.service: 消息文本{"time", "level", "logger", "message"}(命名分组,re.VERBOSE)。
  4. SqliteRepo.add(title: str) -> int:参数化插入、with conn: 事务、返回新 id;再写幂等的 migrate(conn)
  5. 画出(文字版)一个 src 布局的包:pyproject.toml[project.scripts]uv run kb 可用;说出 uv run kbpython -m kbpython src/kb/cli.py 三种运行方式哪一种会失败以及为什么。