这个 scope/block leak 我最初是在学 nim 时看到的: https://github.com/nim-lang/Nim/wiki/Nim-for-Python-Programmers#scoping
最开始我还不是很在意,直到之前接手老项目代码,我都快疯了:if..elif..else 里面藏着 n 个变量,然后在后面使用变量的代码是否能正常运行完全靠运气(当然有一些业务逻辑保证,但业务逻辑一直在变啊,能从静态分析阶段排除的问题非要等到运行时再确认,费时费力) 我之前一直用嵌套 function 的方式来创造 scope ,以达到隔离变量名、最小化变量生命周期的目的 (我经常纠结命名:xx_a 、xx_b, 有了 scope 我全叫它们 xx )
我觉得有两方面的缺失在 python 中
- for 、while 、with 、if 这类应该是隐式 scope ,却不是 (当然 with 列在这里不太合适,但有必要)
- 没有提供显式 scope 块,除非 def
针对第 2 点,我所了解的其他大部分语言都有对应的设计
- nim block:
- zig 、go 、javascript {}
- lua do..end
针对第 1 点,javascript 有 let ,lua 有 local ,上面列出的其他语言没这毛病; python 的 nonlocal 也不是针对这种情况的。
很少见网上有过相关讨论,所以好奇问下大家难道不在意吗?
-- 倒是找到个相关库: https://github.com/l74d/scoping