补全:锁也是输入
(build_id(files):files 是 {文件名: 内容},按文件名排序后逐个喂给 sha256,交回前 8 位——同样的输入永远同样的 id。)
(每道题开头都有同一段:parse_ver 把「1.4.0」变成能比大小的元组,satisfies(版本, 约束) 判一个版本满不满足「>=1.4,<2」这种约束,split_req 把「httpkit>=1.4」切成名字和约束;REPO 是上面那个小仓库。)
(candidates 列出仓库里满足约束的版本(从低到高);resolve(清单) 逐个选最高可用版本、把它的依赖加进队列、约束越收越紧,交回 {包: 版本},无解交回 None。它不回溯——pip 会。)
(这一节多了:parse_requirements 读清单文本(跳过空行和 # 注释),freeze 把选好的版本写成锁文件文本,parse_lock 读回来,diff_lock 比两份锁。)
补全 full_id(files, lock_text):把锁文件当成一个名叫 lock 的文件一起算指纹。同样的源码换一份锁,id 要变。
全部评论