Jackchows / Cangjie5

倉頡五代補完計劃

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

程式可以優化的方向

danny0838 opened this issue · comments

1. 可以考慮用 flake8 等工具把 Python 程式碼格式統一(一般建議盡量以 PEP 8 為主),比較整齊。未來貢獻者也比較知道要貢獻程式碼時怎麼撰寫。

個人習慣安裝的規則集,供參:

flake8 >= 4.0
pep8-naming >= 0.13.2
flake8-comprehensions >= 3.7
flake8-string-format >= 0.3
flake8-quotes >= 3.4
flake8-bugbear >= 22.0
flake8-isort >= 4.2
isort >= 5.5

安裝後在根目錄執行 flake8 scripts 就會自動檢查語法有問題的程式碼。規則設定檔可寫在 .flake8

上述這段可以寫成 requirements.txt 檔案放根目錄或 scripts 目錄下,之後要開發程式時可用 pip install -r requirements.txt 快速安裝相同的依賴套件。

2. 一般程式內部不建議使用 exit(),通常是 raise error 夾帶錯誤資訊給上一層處理,然後在頂層用 try ... except 統一做錯誤處理。命令列程式出錯通常會回傳非 0 數,通常是 print 錯誤訊息到 stderr 再用 sys.exit(1) 中止程式。

3. 要支援複雜一點的程式執行訊息可考慮用 logging 模組

我個人是習慣先這樣設定:

logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')
log = logging.getLogger(__name__)

之後程式就用 log.infolog.warninglog.errorlog.criticallog.debug 輸出執行細節。一般可在 command 加上 -q 參數略過 log.info 的一般訊息及 -v 參數輸出 log.debug 的除錯用訊息。

不過 logging 通常是輸出到 stderr,和輸出到 stdout 的 print 不太一樣。

4. 文字模版用一堆 xxx + yyy 有點醜,通常會把模版文字統一寫在常數(或另一個 script 裡再匯入) TPL_XXX = """... {argname} ...""" 之後用 str.format() 帶入變數內容(還可以做數字格式處理等),或直接寫成 f-string 帶入前面的變數內容: xxx = f"""... {argname} ...

比較大的程式用 """ 的時候,第二行以後都無縮排,會比較亂,可考慮用 textwrap.dedent 讓多行文字和程式碼一起縮排:

text = dedent(
    """\
    xxx
    yyy
    ...
    """
)