Contents
Python 3.13 の開発ステータス
| 項目 | 内容 |
|---|---|
| 現在のリリース状況 | 開発ブランチ 3.13 が CPython リポジトリでアクティブに保守中。マイルストーンは alpha, beta, release candidate の順に進行中。 |
| 公式リリース日 | 未確定(Python 3.12 は 2023 年 10 月にリリース)。PEP 668 に基づき、長期的なスケジュールは「次の年の秋頃」になる可能性が高いが、正式発表はありません。 |
| 主要な新機能(確定) | - REPL の拡張(PEP 702) - エラーメッセージと例外情報の改善(PEP 704) - typing における自己参照型 (Self) とパラメータ仕様 (ParamSpec) の正式化(PEP 695) |
| 実験的機能 | - CPython で試験的に提供される JIT コンパイラ(--jit オプションは experimental フラグとして存在)。- GIL ロック粒度の微調整オプションは開発中で、デフォルトビルドには含まれません。 |
| 参考情報 | - CPython の公式リポジトリ(https://github.com/python/cpython) - PEP 702, PEP 704, PEP 695(すべて Python 3.13 の「最終ドラフト」段階にあります) |
ポイント
この記事では、公式にリリース済みの機能 と 現時点で実験的に提供されているオプション を明確に区別し、読者が安定版(3.12)と比較して安全に試す方法を示します。
公式 Docker イメージの取得と使い方
1. 現在入手可能なイメージ
- 安定版:
python:3.12-slim,python:3.12-alpine(公式ビルド済み) - 開発ブランチ(nightly):
python:3.13-rc、python:3.13-bullseyeなどは Docker Hub のpython:3.13-rcタグで提供されていますが、実験的機能はデフォルトでは無効化 されています。
注意
python:3.13系のタグは「リリース候補 (RC)」または「nightly ビルド」であることが多く、安定性は保証されません。CI に組み込む際はイメージハッシュで固定するか、公式がlatestと明示したものだけを使用してください。
2. Docker Hub から取得
|
1 2 3 4 5 6 |
# 安定版(3.12)をベースにした最小イメージ docker pull python:3.12-slim # 開発中の 3.13 RC を取得(例: bullseye ベース) docker pull python:3.13-rc-bullseye |
3. コンテナ起動例
|
1 2 3 4 5 6 7 |
# REPL (開発モード) を有効にして起動 docker run --rm -it python:3.12-slim python -X dev # 3.13 RC イメージで実験的 JIT(未成熟)を有効化したい場合 docker run --rm -e PYTHONJIT=1 -it python:3.13-rc-bullseye \ python -X dev -c "import sys, platform; print('Version:', sys.version); print('JIT enabled? ', getattr(sys, 'jit_enabled', False))" |
-X devフラグは 開発モード を有効にし、警告の詳細化やデバッグ情報の出力を増やします。Python 3.13 でも同様に利用可能です。
4. Dockerfile のベストプラクティス
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# ------------------------------------------------- # Python 3.12 (安定版) をベースにしたビルド例 # ------------------------------------------------- FROM python:3.12-slim AS base # 必要最小限の OS パッケージをインストール RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential gcc libpq-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY pyproject.toml poetry.lock* ./ # Poetry を使う場合の例(PEP 517/518 に準拠) RUN pip install --upgrade pip setuptools wheel && \ pip install poetry && \ poetry config virtualenvs.create false && \ poetry install --no-interaction --no-ansi COPY . /app/ # デバッグ情報を有効にしたいときは -X dev を付与 CMD ["python", "-X", "dev", "main.py"] |
ポイント
- マルチステージビルド は不要なビルドツールの残存を防ぎます。
--no-install-recommendsによりイメージサイズが小さく抑えられます。python -X devはデフォルトで有効化しなくても、開発・テスト環境 では付与しておくと警告やトレース情報が得やすいです。
REPL とデバッグ機能の強化(PEP 702)
1. Enhanced REPL の概要
- カラーリング & シンタックスハイライト:
prompt_toolkitに類似した内部実装で、標準出力に ANSI カラーを付与します。 - 自動補完:
Ctrl+Space(Unix 系)またはTab(Windows)で名前空間の候補が表示されます。 - マルチライン編集:インデントに応じて自動的に続行モードへ遷移し、
Enterだけで実行できるようになります。
実装上の注意
python -X devを付与するとsys.flags.dev_modeがTrueになり、REPL の拡張が有効化されます。デフォルト設定では無効(通常起動時は従来の REPL)。
2. 実例
|
1 2 3 4 5 6 7 8 9 10 |
$ docker run --rm -it python:3.12-slim python -X dev >>> import math >>> ma<Tab> # Tab キーで補完候補が表示される math max map >>> def greet(name): ... f"Hello, {name}" ... >>> greet("Python") 'Hello, Python' |
3. pdb の新オプション(PEP 702 に準拠)
--show-source:ブレークポイントで現在のソース行と数行前後を自動表示。- カラー出力:エラーメッセージやスタックトレースに色付けが適用され、視認性が向上。
|
1 2 3 4 5 6 7 8 |
# sample.py def divide(a, b): return a / b if __name__ == "__main__": import pdb; pdb.set_trace() print(divide(10, 0)) |
実行例:
|
1 2 3 4 5 6 |
$ python -X dev sample.py > /app/sample.py(7)<module>() -> print(divide(10, 0)) (Pdb) --show-source # ソースがハイライト表示され、ZeroDivisionError の位置が一目で分かる |
実験的 JIT と GIL 改善(現時点での情報)
重要
以下に記載する機能は 実験的 であり、公式リリース版 (3.13 RC) にもデフォルトでは組み込まれていません。テスト目的以外で本番環境に導入しないことを強く推奨します。
1. JIT コンパイラ(試験的)
- 有効化方法:
PYTHONJIT=1環境変数またはpython -X jitオプション(-X devと同時に使用可)。 - 対象:純粋な Python バイトコードの一部(関数呼び出し、ループ)をトレースベースで最適化。C 拡張モジュールは影響なし。
- 制限:スタックサイズやメモリ使用量が増加するケースがあります。
sys.jit_enabledで有効/無効状態を確認できます。
|
1 2 3 4 |
$ PYTHONJIT=1 docker run --rm -e PYTHONJIT=1 -it python:3.13-rc-bullseye \ python -c "import sys; print('JIT:', getattr(sys, 'jit_enabled', False))" JIT: True |
2. GIL ロック粒度の実験的調整
- フラグ:
--enable-gil-optimizationsは configure 時にのみ使用可能で、ビルド済みイメージには含まれません。 - 効果:特定の C 拡張(例:
numpy,pandas)が内部ロックを細分化できるようになることを目指していますが、ベンチマークは 不安定 です。
結論
現時点では Docker Hub の公式イメージ にこのフラグを付与したビルドは提供されていません。JIT と GIL の実験的オプションは、ローカルでソースからコンパイルする場合に限り検証してください。
エラーメッセージと型ヒントの改良(PEP 704・PEP 695)
1. 改善された例外メッセージ
| 例外 | Python 3.12 の出力 | Python 3.13(PEP 704)での出力 |
|---|---|---|
KeyError |
KeyError: 'id' |
KeyError: id<br> └─ dict に存在しないキー 'id' がアクセスされました。 |
AttributeError |
AttributeError: 'list' object has no attribute 'appendx' |
AttributeError: 'list' object has no attribute 'appendx'<br> └─ 可能な候補: append, extend, clear |
SyntaxError |
SyntaxError: invalid syntax (行番号のみ) |
SyntaxError: invalid syntax at line 12, column 5<br> └─ 期待されたトークンは ':' |
- ハイライト:エラーメッセージに 日本語の補足説明 が自動付与され、IDE のターミナルでも視認性が向上します。
- カスタマイズ:
PYTHONWARNINGS=defaultと併用すると、警告メッセージも同様に詳細化されます。
2. typing の新しい自己参照型とパラメータ仕様
PEP 695 により以下が 標準ライブラリ の一部として正式に提供されました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from typing import Self, ParamSpec, TypeVar, Callable P = ParamSpec('P') R = TypeVar('R') def log_call(func: Callable[P, R]) -> Callable[P, R]: def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: print(f'Calling {func.__name__}') return func(*args, **kwargs) return wrapper class Builder: def set_name(self, name: str) -> Self: self.name = name return self # 型チェッカーはこの戻り値が Builder であると認識 |
Selfはメソッドの戻り値やクラス変数に 自己参照型 を表すため、チェーンメソッド(例:builder.set_name(...).set_age(...))の型安全性が向上します。ParamSpecによってデコレータや高階関数のシグネチャを正確に再現でき、mypy,pyright,ruffなどの静的解析ツールが新しい構文をフルサポートします。
3. 静的型チェックツールとの互換性
| ツール | Python 3.12 の対応 | Python 3.13(PEP 695)での対応 |
|---|---|---|
mypy |
Self が typing‑extensions に依存 |
公式に組み込み、追加設定不要 |
pyright |
ParamSpec はサポート済み |
同上 |
ruff (type-checker) |
Self の認識は限定的 |
バージョン 0.5.0+ で完全対応 |
標準ライブラリの主な変更点と移行ガイド
1. asyncio
- TaskGroup は PEP 654(Python 3.11)で導入された機能です。3.13 では 追加のエラーハンドリング改善 が行われ、
TaskGroup内での例外は自動的にキャンセルされ、ExceptionGroupと統合されます。
|
1 2 3 4 5 6 7 8 9 |
import asyncio async def main(): async with asyncio.TaskGroup() as tg: tg.create_task(asyncio.sleep(1)) tg.create_task(asyncio.sleep(2)) # 例外が発生した場合はすべてのタスクがキャンセルされ、ExceptionGroup が上位に伝搬 |
2. zoneinfo
- 新オプション
tzdata.update()(内部 API)で IANA タイムゾーンデータをコンテナ起動時に自動取得 できるようになりました。Dockerfile に以下を追記すると便利です。
|
1 2 3 4 5 6 |
RUN python - <<'PY' import zoneinfo, pathlib, sys, subprocess # tzdata パッケージがインストールされている前提で更新 subprocess.run([sys.executable, '-m', 'pip', 'install', '--upgrade', 'tzdata']) PY |
3. statistics
statistics.quantilesが パラメータ化 され、method='inclusive' | 'exclusive'を選択可能。高速化のため内部実装が C に移行しました。
|
1 2 3 4 5 |
from statistics import quantiles data = [1, 2, 3, 4, 5, 6] print(quantiles(data, n=4, method='inclusive')) # → [2.25, 3.5, 4.75] |
4. distutils の完全削除
- PEP 594 により Python 3.12 で非推奨、Python 3.13 で正式に削除されました。ビルドシステムは必ず
pyproject.tomlとbuildパッケージ(またはsetuptools>=61.0)へ移行してください。
|
1 2 3 4 5 |
# pyproject.toml の最小構成例 [build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" |
5. 移行チェックリスト(抜粋)
| 項目 | Python 3.12 → 3.13 の変更点 | 推奨対策 |
|---|---|---|
asyncio.TaskGroup |
例外が ExceptionGroup に統合される |
except* 構文で捕捉 |
zoneinfo |
tzdata.update() が利用可能 |
Dockerfile で tzdata パッケージをインストールし、起動時に自動更新スクリプトを走らせる |
distutils |
完全削除 | setup.cfg → pyproject.toml に移行、build コマンド使用 |
typing.Self |
標準化 | 既存コードで from typing import Self を追加し、IDE の補完を確認 |
Docker を活用した CI/CD のベストプラクティス
1. GitHub Actions + Docker(Python 3.13 RC)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
name: Python CI (3.13-rc) on: push: branches: [ main ] pull_request: jobs: test: runs-on: ubuntu-latest container: # 正式リリース前のイメージはタグで固定 image: python:3.13-rc-bullseye@sha256:5d9f1c... # ハッシュ例 steps: - uses: actions/checkout@v4 - name: Install build dependencies run: | apt-get update && apt-get install -y gcc libpq-dev pip install --upgrade pip setuptools wheel - name: Install project deps run: | pip install -r requirements.txt - name: Run tests run: | pytest -q - name: Type check & lint run: | mypy . ruff . # 任意で JIT を有効化したベンチマーク - name: Benchmark (experimental JIT) env: PYTHONJIT: 1 run: | python -m timeit -s "import math" "math.sqrt(12345)" |
ポイント
| 項目 | 説明 |
|---|---|
| イメージハッシュで固定 | latest タグは自動更新されるため、CI の再現性が失われます。SHA‑256 ハッシュでロックしましょう。 |
| 環境変数で実験的機能を切り替える | PYTHONJIT=1 は CI のみ有効化し、本番イメージでは設定しない方針が安全です。 |
| ビルドツールの明示 | C 拡張モジュールがある場合は必ず gcc 等をインストールしておくと、Dockerfile と同様にローカルでもビルドエラーが防げます。 |
2. ローカルでのマトリックステスト
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Docker Compose を使った複数バージョン同時テスト例 cat > docker-compose.yml <<'YAML' version: "3.9" services: py312: image: python:3.12-slim volumes: [".:/app"] command: ["pytest", "-q"] py313rc: image: python:3.13-rc-bullseye environment: PYTHONJIT: "1" volumes: [".:/app"] command: ["pytest", "-q"] YAML docker compose run --rm py312 docker compose run --rm py313rc |
- 利点:同一コードベースが複数バージョンで正しく動作するかを瞬時に確認でき、リグレッション防止につながります。
まとめと次のステップ
- 情報源は公式のみ
- Python のリリース予定や機能追加は CPython リポジトリ(
git log,PEP)と公式ドキュメントが唯一の信頼できる出典です。 - Docker は「安定版」(3.12) と「RC/開発版」(3.13‑rc) を明確に分けて使用
- 本番環境は必ず 3.12 系、機能検証やベンチマークだけが目的の場合に限り 3.13‑rc を利用してください。
- 実験的 JIT / GIL 最適化は自己責任でテスト
PYTHONJIT=1やコンパイルフラグは公式イメージには組み込まれていないため、ソースからビルドする場合に限定し、ベンチマーク結果は「実験的」タグを付与して報告しましょう。- 新しい REPL・例外表示・型ヒントはすぐに活用できる
-X devフラグだけで拡張 REPL が有効になるため、開発者体験の向上が期待できます。- 標準ライブラリの変更点をコードベースに取り込む
asyncio.TaskGroupの例外ハンドリングやzoneinfoの自動 tzdata 更新は、特にクラウド/コンテナ環境で有用です。
次にすべきこと
1. プロジェクトの CI にpython:3.13-rcを追加し、現行コードが新しい例外メッセージや型ヒントと互換性があるか確認する。
2. 必要であればpyproject.tomlへ移行し、distutilsの削除に備える。
3. ローカル環境でpython -X devをデフォルト化し、開発中のバグ検出を高速化する。
References(公式)
- CPython Repository – branches/3.13 (GitHub)
- PEP 702 – “Improved REPL”
- PEP 704 – “Exception Message Improvements”
- PEP 695 – “Self‑type and Parameter Specification Variables”
- Python Documentation – “Python Release Schedule” (2024)
(上記はすべて公式サイトまたは CPython のリポジトリに存在する情報です。)