Black 局部格式化后全文件 check 误报通过,避免写入完整缓存
Black 局部格式化错误写入完整文件缓存时会使全文件检查误通过,应采用缓存写入修复并连续验证两种入口。
只格式化文件第一行后,第二行还明显不符合格式,随后 black --check 却退出 0,并提示文件自上次运行以来未修改,要检查局部格式化写入缓存的路径。Black 26.5.1 的病例中,--line-ranges 格式化和局部检查都可能留下这样的缓存项。
旧缓存只记录整个文件的状态,没有把选中的行范围编码进去。局部操作结束后,它仍将该文件登记为已完成格式化。后续全文件检查命中缓存,跳过真正的格式化判断,于是未处理的部分也被当作合格。
Black 26.10.1 包含修复:使用行范围时不写完整文件缓存。已经由全文件格式化建立的缓存仍可读取,不需要为了局部编辑禁用所有缓存。采用修复版本后,应处理旧的错误缓存项,并复验局部操作与完整检查的连续流程。
python -m pip install "black==26.10.1"
在独立目录建立 range-check.py:
x = 1
y = 2
用专门的缓存目录检查这一链条,例如在 POSIX shell 中:
export BLACK_CACHE_DIR="$PWD/.black-range-check-cache"
python -m black --line-ranges 1-1 range-check.py
python -m black --check range-check.py
第二条命令应发现第二行仍需格式化,并退出 1。这个退出码是预期的格式检查失败,不是安装故障。接着全文件格式化,再检查,才应得到通过。
python -m black range-check.py
python -m black --check range-check.py
暂时不能更新时,对正式的全文件验收加 --no-cache,可避免信任错误缓存;局部编辑完成不应直接作为完整文件的格式化证明。若用旧缓存复验新版本,也应先确认缓存隔离或清理策略,防止把已有错误记录误算成修复失败。
验收应覆盖局部写回和 --check --line-ranges 两种入口,并确认未选中的行是否仍需修改。经过 stdin 的编辑器流程不一定使用同一文件缓存,不能仅凭编辑器操作正常就推断 pre-commit 或 CI 也正常。
这个修复针对范围操作错误标记全文件完成。版本不同、配置不同或某些格式改动跨越选中行,仍需单独分析;只删除缓存一次,也没有修复旧工具再次写入错误状态的逻辑。


