Python 3.15 在 2026 年 10 月 9 日正式推出。這次更新讓程式可以延後載入暫時用不到的模組,統一預設文字編碼,也補上不可變字典與效能分析工具。對平常處理報表、檔案或自動化工作的使用者,影響會落在啟動時間、中文資料讀寫,以及既有套件能否繼續使用。

Python 3.15 是什麼

Python 是由開源社群開發、Python Software Foundation 支持的程式語言,常用於資料分析、網站後端與工作自動化。程式交給解譯器執行,額外功能則透過套件補充;3.15 是 Python 3 系列的新功能版本,包含語法、標準函式庫與執行環境更新。

這篇介紹的官方版本以 CPython 為主,也就是一般從 Python 官網取得的實作。升級後可以使用新功能,但各專案仍有自己的依賴條件。uv 這類工具負責管理版本與套件,和 Python 本身的改版是不同工作。

新功能如何影響日常開發

這次與日常工作較有關的變化,包括模組何時載入、文字如何解讀,以及如何表達不應修改或尚未提供的資料。

延後載入用不到的模組

一般匯入在開始工作前載入模組,延後載入則把未使用模組留到需要時載入
載入成本移到第一次使用時。

lazy imports 讓開發者明確指定,等到第一次使用模組時才載入。以報表工具為例,查詢版本時可能只需要顯示文字,產生圖表才需要繪圖套件。把後者延後載入,就能減少簡單操作啟動時的準備工作。

既有匯入預設仍照原本方式運作,程式需要主動採用新機制。載入成本會移到第一次使用時,模組初始化與載入失敗的時間點也跟著改變。依賴匯入動作註冊外掛或完成設定的程式,需要檢查執行順序。設計背景見 PEP 810 。

以下範例使用 Python 3.15。json 會等到解析資料時才載入;前面的啟動訊息可以先顯示。

# Python 3.15:延後載入標準函式庫
lazy import json

print("工具已啟動")
data = json.loads('{"count": 3}')
print(data["count"])  # 輸出 3

預設使用 UTF-8

Python 3.15 預設開啟 UTF-8 模式,未指定編碼的文字輸入輸出會使用 UTF-8。過去某些程式在不同電腦上,會因系統語系而採用不同編碼;這次更新能減少這種差異,對跨平台處理中文資料尤其實用。

既有 Big5 或其他舊編碼檔案仍維持原格式。若報表原本依賴系統預設編碼讀取,升級後可能出現解碼錯誤或亂碼。處理方式是確認來源格式,明確指定讀寫編碼;官方也提供編碼警告協助找出受影響位置,必要時可暫時關閉 UTF-8 模式,再逐項修正。詳見 PEP 686 。

範例直接在記憶體中建立文字串流,觀察預設編碼,不會產生檔案;正式處理外部資料時,仍適合明確指定來源編碼。

# Python 3.15:預設 UTF-8 模式下執行
import io

raw = io.BytesIO("中文報表".encode("utf-8"))
with io.TextIOWrapper(raw) as text:
    print(text.encoding)  # utf-8
    print(text.read())    # 中文報表

不可變字典

Python 3.15 將 frozendict 加入內建型別,建立後不能增刪或替換項目,適合保存固定設定與查找資料。舊版已有第三方不可變字典套件,這次可以直接使用,不需另外安裝。規格見 PEP 814 。

標準函式庫從 Python 3.3 起也有 MappingProxyType ,但它提供的是原字典的唯讀視圖:透過視圖不能修改項目,原字典從別處修改時,視圖仍會跟著變。frozendict 從字典建立時會淺複製項目,原字典後續增刪或替換項目不會影響它;不過,兩者若共用清單等可變物件,物件內部的修改仍會反映出來。

# Python 3.15:固定設定建立後不能改項目
settings = frozendict(language="zh-TW", retries=3)
print(settings["retries"])  # 輸出 3

try:
    settings["retries"] = 5
except TypeError:
    print("設定項目不能修改")

區分未提供與空值

sentinel 則用來建立可辨識的特殊標記。例如更新會員資料時,「沒有提供電話」可能表示保留原值,「明確清空電話」則表示刪除原值。兩者需要分開處理,sentinel 可以代表尚未提供的狀態,讓介面與資料處理邏輯更明確。設計理由見 PEP 661 。

# Python 3.15:用專屬標記代表沒有傳入資料
MISSING = sentinel("MISSING")

def update_phone(phone=MISSING):
    if phone is MISSING:
        return "保留原電話"
    if phone is None:
        return "清空電話"
    return f"更新電話:{phone}"

print(update_phone())      # 保留原電話
print(update_phone(None))  # 清空電話

多執行緒與效能分析的進展

free-threaded 版本允許多個執行緒同時執行 Python 程式,適合進一步利用多核心處理器。3.15 為這類版本加入穩定的二進位介面 ABI,讓採用對應介面的原生擴充套件,有機會跨後續版本沿用編譯成果,減少維護與發佈負擔。

這項改進主要需要套件維護者配合。使用者選擇 free-threaded 環境時,仍須確認依賴是否支援,並檢查程式同時修改共享資料的方式。macOS 官方安裝程式預設也會安裝 free-threading 支援,實際執行仍要選對環境。介面設計見 PEP 803 。

以下檢查目前 CPython 是否啟用 GIL,也就是限制多執行緒同時執行 Python 程式的全域鎖。這是環境確認,ABI 的採用則由擴充套件建置設定決定。

# CPython 3.15:確認目前執行環境
import sys

if sys._is_gil_enabled():
    print("目前啟用 GIL")
else:
    print("目前停用 GIL,可使用 free-threading")

找效能瓶頸則多了 Tachyon 取樣分析工具,可觀察正在執行的程式,協助找出時間花在哪些函式。它被納入新的 profiling 套件,適合調查服務變慢或背景工作卡住的原因。取樣結果反映時間分布,短到不足以累積樣本的工作,則適合採用其他量測方法。

以下是官方指令的改寫,需以 Python 3.15 執行;report.py 代表已存在的程式,指令會啟動它並分析,因此原程式的檔案與網路操作也會照常發生。

# Python 3.15:執行既有程式並收集效能樣本
python -m profiling.sampling run report.py

既有專案適合立即升級嗎

既有專案適合在依賴與工作結果確認相容後升級。已在運作的網站、報表或自動化工作,可以保留原環境,另外建立測試環境,依序確認套件安裝、中文檔案讀寫與日常工作結果。新專案則先核對框架支援。需要管理多個版本時,可參考 uv 與 Python 環境管理教學 。

套件尚未支援、部署平台還沒提供對應環境,或目前工作依賴舊編碼時,可以先留在仍受支援的原版本。升級的判斷應放在新功能是否解決現有需求,以及相容性是否確認完成;實際安裝時,再選擇 3.15 系列當時的最新修補版。

參考來源

發佈留言