今天再带大家学习一个Python 3.14的新特性。禁止在 finally 块中使用 return、break、continue 等控制流语句。这项更改由 PEP 765 提出,旨在提升代码的可读性和健壮性。
为什么禁止?
在 Python 的早期版本中,允许在 finally 块中使用如 return、break、continue 这样的控制流语句。虽然语法是合法的,但这种行为可能导致令人困惑的结果。
例如:
看起来函数应返回 1,但实际上 finally 中的 return 覆盖了原始返回值,最终输出的是 2。
这种“意外覆盖”行为违背了大多数开发者的直觉,容易引发逻辑错误。
并且会给后期排错工作造成很大的麻烦...
PEP 765 做了什么?
从 Python 3.14 开始,在 finally 块中使用以下控制流语句将引发SyntaxError:
return
break
continue
yield
await
yield from
PEP 765 仅明确禁止了return、break、continue 和 yield 在 finally 块中使用,但在 Python 3.14 的实际实现中,也扩展禁止了 yield from 和 await,以保证异步和生成器控制流的一致性。
示例:
注意:raise 仍被允许,因为它属于异常处理机制的一部分,不会造成类似的控制流混乱。
>> PEP 765入口 <<
设计初衷
Python 核心团队希望开发者将 finally 块用于资源清理等操作,而不是作为控制流程的一部分。
通过禁止这类行为,Python 强制提升了代码的一致性和可维护性。
如何替代?
如果你之前依赖在 finally 中进行条件跳转或返回,建议将相关逻辑移到 try 块中处理,只在 finally 中执行必要的清理工作:
finally 块应专注于清理资源,而非改变程序流向。
如果未来需要把Python版本升到3.14 或更高版本,需要检查代码是否在 finally 中使用了上述控制流语句,及时调整以避免运行时错误造成Bug。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/13102/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料