PyPyBridge

异常即主流,标注即文档

没有受检异常,EAFP 是哲学;类型标注把 Java 编译器的检查搬回来当可选插件。

14 分钟 · 右栏代码可点击「运行」


try/catch → try/except/else/finally

Java
1try {
2 int v = Integer.parseInt(raw);
3 } catch (NumberFormatException e) {
4 v = 0;
5 } finally {
6 cleanup();
7 }
Python
1try:
2 v = int(raw)
3except ValueError: # 永远写具体异常,别裸 except
4 v = 0
5else: # 没抛异常时执行(Java 没有)
6 audit(v)
7finally:
8 cleanup()
  • 自定义异常 = 继承 Exceptionclass AppError(Exception): ...。抛出用 raise
  • 异常链:raise ParseError(...) from e,等价于 Java 的 cause。

EAFP:先做,炸了再处理

Java
1if (map.containsKey(key)) {
2 return map.get(key);
3}
4return DEFAULT; // LBYL:先检查再做
Python
1try:
2 return cache[key]
3except KeyError:
4 return DEFAULT # EAFP:直接做,失败兜底
  • EAFP(Easier to Ask Forgiveness than Permission)是 Python 官方哲学。检查与执行之间的竞态也顺带消失了。
  • 受检异常不存在 —— 方法签名不声明会抛什么,靠文档字符串和 Raises: 段落约定。

类型标注:把编译器当可选插件

Java
1Optional<User> findUser(String id);
2List<String> tags;
3
4// 编译期强制
Python
1def find_user(uid: str) -> User | None: ...
2tags: list[str] = []
3
4# 运行时完全忽略标注,但:
5# mypy / pyright 会在静态阶段报错
  • Optional[T] / T | None 取代 @Nullable;泛型用小写内建 list[str]dict[str, int](3.9+)。
  • 现代 Python 项目标注覆盖率很高,CI 里跑 pyright 就能找回大半个 Java 编译器的安全感。

TIP

开发流程对比Java:写码 → javac 报错 → 修。Python:写码 → 跑/测试发现 → 修,静态错误由 pyright 在编辑器里实时补位。IDE 里装 Pylance,体验立刻接近 Java。

练一练

这张卡的示例代码已在游乐场中备好,改一改再运行。

在游乐场中打开