Google Python Style Guide 要點
這是什麼?
Google Python Style Guide 是 Google 內部使用的 Python 程式碼風格規範,被廣泛採用為業界標準。實驗室以此為基礎,搭配 Ruff 自動強制執行大部分規則。
為什麼要有程式碼風格?
同一份程式碼可能由多人在不同時間閱讀和修改。一致的風格讓人能快速讀懂別人的程式碼,減少認知負擔。
實驗室最常用到的規則
1. 命名規範
| 對象 | 規則 | 範例 |
|---|---|---|
| 函式 / 變數 | snake_case |
compute_reward, obs_dim |
| 類別 | PascalCase |
ReplayBuffer, PolicyNetwork |
| 常數 | UPPER_SNAKE_CASE |
MAX_EPISODE_STEPS = 1000 |
| 私有成員 | 單底線開頭 | _normalize, self._buffer |
| 模組檔案 | snake_case.py |
reward_shaping.py |
# ❌ 不符合規範
def ComputeReward(Obs, Scale):
maxSteps = 1000
return Obs * Scale
# ✅ 符合規範
MAX_STEPS = 1000
def compute_reward(obs: float, scale: float) -> float:
return obs * scale
2. 行長與換行
- 每行不超過 88 個字元(Ruff 預設值,略寬於原版的 80)
- 函式參數過多時,每個參數獨立一行:
# ❌ 超出行長
def train_agent(env_name, num_episodes, learning_rate, gamma, clip_ratio, device):
# ✅ 每個參數獨立一行
def train_agent(
env_name: str,
num_episodes: int,
learning_rate: float,
gamma: float = 0.99,
clip_ratio: float = 0.2,
device: str = "cuda",
) -> None:
3. 引號
統一使用雙引號 "(Ruff 會自動轉換):
4. Import 順序
Import 分三組,組間空一行,Ruff 會自動排序(I 規則):
# 第一組:標準函式庫
import os
import random
from typing import Optional
# 第二組:第三方套件
import numpy as np
import torch
import torch.nn as nn
# 第三組:本專案模組
from your_project.models import PolicyNetwork
from your_project.utils import seed_everything
5. 避免萬用 Import
# ❌ 禁止(會汙染命名空間,難以追蹤來源)
from numpy import *
from torch.nn import *
# ✅ 明確指定
import numpy as np
from torch.nn import Linear, ReLU
6. 例外處理
捕捉具體的例外類型,不要用裸 except:
# ❌ 會捕捉所有例外,包括 KeyboardInterrupt
try:
load_checkpoint(path)
except:
pass
# ✅ 只捕捉預期的例外
try:
load_checkpoint(path)
except FileNotFoundError:
logger.warning("Checkpoint not found, training from scratch.")
7. 不要用可變物件當預設參數
# ❌ 所有呼叫共享同一個 list,會產生難以察覺的 bug
def add_result(value, results=[]):
results.append(value)
return results
# ✅ 用 None 作為哨兵值
def add_result(value: float, results: list | None = None) -> list:
if results is None:
results = []
results.append(value)
return results
Ruff 自動處理的部分
實驗室的 pyproject.toml 已啟用以下規則,commit 前執行 ruff check . --fix && ruff format . 即可自動修正:
| 規則代碼 | 涵蓋內容 |
|---|---|
E |
基本語法與格式錯誤 |
F |
未使用的 import、未定義的變數 |
W |
警告(如尾端空白) |
I |
Import 排序 |
N |
命名規範(PascalCase、snake_case 等) |