导读:PyCon 的一场演讲让他决定重构整个 Python 工作流。核心标准只有一个:最少总工作量。
从教育项目到模板仓库
他的 python-prototype 仓库最初只是为了教学。现在他想让它成为随手可用的项目模板。
借着升级测试框架(pytest)和打包配置(pyproject)的机会,他开始思考:还能加什么?
Black 和代码检查工具用了很多年,但有没有更好的方案——能自动维护代码风格(PEP 8)、文档字符串(PEP 257)和类型提示(PEP 484)?
开发环境也得现代化。Poetry 还是 uv?这像极了 emacs 与 vi 的阵营之争,还没算上其他工具。
他需要的东西要覆盖代码质量、格式化、打包,甚至更多:减少依赖记忆或翻阅 README 的任务,提高实际执行的概率。
没有"一站式套餐",只能测试各种维护良好、可持续的方案,找到最适合自己的。
唯一标准:懒人的总成本
驱动所有选择的单一准则是:最少总工作量。
工具越少 = 配置越少 = 维护越少。
这位"懒"开发者希望工具链在提交前就拦截问题,防止步骤被遗漏。但不过度:刚好足够产出高质量代码。
第一次用代码检查工具扫描 simple-sample 时,分数刺痛了他:4.35/10。高中生的成绩,不该出现在教学仓库里。
他坐下来修正 JavaScript 后遗症:myClass 改成 my_class(PEP 8 命名规范),foo、bar、foobar 改成 get_param_processing、get_boolean、get_reverse_protected_param——能说明用途的名字。
分数爬到 9.41/10。
工具的三道判断题
庆祝之前,三个警告需要裁决。每个都是"工具对代码的判断正确,但对上下文判断错误"。
这就是静态分析的边界:它告诉你发现了什么,却不告诉你是否真的需要修复。逐案判断仍由人做,工具本身不会自动改变任何东西。
他主动找麻烦,对测试套件运行检查。新警告出现:W0621 redefining-outer-name,指向 fixture:
「工具说'你在重新定义外部作用域的 mci'。但这种模式正是 fixture 的工作方式:不是重定义,是参数注入。」
检查器像执行代码一样读代码,却不知道 pytest 如何运行它。
误报。变通方案存在:给 fixture 加 name 参数,让函数名和注入名分离。但这只是为了消除噪音,而非改进代码本身。
一图拆解:懒人的质量防线
整个实验的核心逻辑可以用一张图概括——从代码提交前的拦截机制,到工具选择的成本公式。
第一层:提交前拦截。工具链必须在 git commit 之前崩溃,而不是在生产环境。这是"懒"的精髓:用自动化替代记忆。
第二层:工具数量与维护成本的反比关系。每增加一个工具,配置文件的乘法效应就开始了——格式化器的行长、检查器的禁用规则、测试框架的搜索路径,各自为政。
第三层:误报的处理成本。W0621 不是孤例。每个误报都需要人类判断:是真的问题,还是工具不懂上下文?这种判断消耗的认知资源,必须计入"总工作量"。
第四层:代码可读性的复利。get_param_processing 比 foo 多打的字符,会在六个月后的调试中连本带利返还。命名是写给未来的自己的信。
第五层:教育代码的示范义务。4.35/10 的分数不只是难堪——它传递了"代码质量可有可无"的错误信号。模板仓库的每一行都是教学材料。
Poetry 与 uv:环境管理的阵营战
回到那个未完成的抉择。作者提到了 Poetry 和 uv 的对立,像 emacs 与 vi 的永恒战争。
但原文没有给出他的最终选择。我们只能看到思考框架:维护状态、社区活跃度、与现有工作流的集成成本。
这种开放性本身就是诚实——工具选型没有标准答案,只有特定上下文下的局部最优。
他的方法论是测试驱动:不依赖口碑或
热门跟贴