这几个代码风格技巧,让你的 Python 代码看起来像高级工程师写的。
1. 用 dict 解包合并替代 update()
看起来没问题,但其实有更好的方式:
merged = base.copy()merged.update(override)
优雅,太优雅了:
merged = {**base, **override}
字典解包语法简洁直观,Python 3.9+ 还能用 | 运算符:
merged = base | override。
2. 用 Path 替代 os.path 拼路径
一开始以为只能这么写:
import ospath = os.path.join(os.path.expanduser('~'), 'data', 'file.txt')if os.path.exists(path): os.remove(path)
一行代码就能搞定:
from pathlib import Pathpath = Path.home() / 'data' / 'file.txt'if path.exists(): path.unlink()
Path 是面向对象的路径操作,/ 运算符拼路径直观优雅,还跨平台,Python 3.4+ 内置。
3. 用 Enum 替代魔法数字/字符串
大多数人的代码答案通常长这样:
status = 1 # 1=待处理 2=处理中 3=完成if status == 1: handle_pending()
重构之后同事以为我换了个人:
from enumimport Enumclass Status(Enum): PENDING = 1 PROCESSING = 2 DONE = 3if status == Status.PENDING: handle_pending()
魔法数字/字符串满天飞是 bug 温床。
Enum 让代码自文档化,IDE 还能自动补全。
4. 用 __post_init__ 做 dataclass 后处理
刚学 Python 的时候我这么写过:
@dataclassclass Config: width: int height: int area: int # 还得手动算
后来我发现了这个写法,直接封神:
@dataclassclass Config: width: int height: int area: int = field(init=False) def __post_init__(self): self.area = self.width * self.height
__post_init__ 在 __init__ 后自动调用,适合计算派生字段。area 不用传,自动算好。
5. 用 except Exception 替代裸 except
很多教程会教你这么写:
try: risky_operation()except: log_error()
换成这样就优雅多了:
try: risky_operation()except Exception as e: log_error(e)
裸 except 连 KeyboardInterrupt、SystemExit 都捕获,程序都退不了,至少 catch Exception。
速查表
| 场景 | 别这样写 | 试试这样 |
|---|
| 合并字典 | dict.update() | {**base, **override} |
| 拼文件路径 | os.path.join() | Path() / 'subdir' |
| 魔法数字 | status = 1 | Status.PENDING |
| dataclass 计算字段 | 手动赋值 | __post_init__() |
| 捕获异常 | 裸 except: | except Exception as e: |
这些改动不需要你学新框架,也不需要重构架构,你只需要在下次写代码时,稍微嫌弃一下自己的旧写法。
今天就挑你代码里最常见的一个场景,用右边的写法重写一遍。你可能会发现:代码变短了,bug 变少了,连心情都变好了。