Python3.13正式リリースが出ました！

# Python 3.13 新機能と変更点まとめ

Pythonプログラミング言語の最新安定版であるPython 3.13が正式にリリースされました。

https://www.python.org/downloads/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114394/d2ed519d-76e8-7324-9aa2-56b755a5d4cf.png)

この記事では、[Python 3.13のリリースノート](https://docs.python.org/ja/3/whatsnew/3.13.html)に基づき、前バージョン(Python 3.12)からの主な変更点や新機能を解説します。

## ハイライト

Python 3.13では、言語自体、実装、および標準ライブラリにさまざまな変更が加えられています。主な変更点は以下の通りです:

- **新しい対話型インタプリタの導入**：ユーザーエクスペリエンスを大幅に向上させる新しい対話型シェルがデフォルトとなりました。
- **フリー・スレッディッドモードの実験的サポート**([PEP 703](https://peps.python.org/pep-0703/)): グローバルインタプリタロック(GIL)を無効にしてPythonコードを実行できるようになりました。
- **ジャストインタイム(JIT)コンパイラの追加**([PEP 744](https://peps.python.org/pep-0744/)): パフォーマンス向上を目指したJITコンパイラが実験的に導入されました。

さらに、エラーメッセージが引き続き改善され、トレースバックがデフォルトでカラー表示されるようになりました。また、[`locals()`](https://docs.python.org/ja/3/library/functions.html#locals)組み込み関数の動作が明確化され、型パラメータにデフォルト値がサポートされるようになりました。

## インタプリタの改善

### 新しい対話型インタプリタ

PyPyプロジェクトのコードをベースにした新しい対話型シェルがデフォルトとなりました。主な特徴は:

- **複数行の編集と履歴の保持**: 複数行にわたるコードの編集が可能になり、履歴も保存されます。
- **直接的なREPLコマンドのサポート**: `help`, `exit`, `quit`などのコマンドが関数呼び出しなしで利用できます。
- **カラー表示**: プロンプトやトレースバックがデフォルトでカラー表示されます。
- **インタラクティブなヘルプブラウジング**: F1キーでヘルプを閲覧できます。
- **履歴のブラウジング**: F2キーで出力やプロンプトを除いた履歴の閲覧が可能です。
- **ペーストモード**: F3キーで大きなコードブロックのペーストが容易になります。

新しい対話型シェルを無効にするには、環境変数[`PYTHON_BASIC_REPL`](https://docs.python.org/ja/3/using/cmdline.html#envvar-PYTHON_BASIC_REPL)を設定してください。

![スクリーンショット 2024-10-09 1.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114394/310aa6a9-65fe-d4d8-3102-a423c76c5ee8.png)

### エラーメッセージの改善

- **カラー付きトレースバック**: ターミナルでのトレースバックがデフォルトでカラー表示されます。環境変数[`PYTHON_COLORS`](https://docs.python.org/ja/3/using/cmdline.html#envvar-PYTHON_COLORS), [`NO_COLOR`](https://no-color.org/), [`FORCE_COLOR`](https://force-color.org/)で制御可能です。
- **モジュール名の衝突に関する警告**: ユーザースクリプトが標準ライブラリやサードパーティのモジュール名と衝突している場合、より具体的なエラーメッセージが表示されます。
- **キーワード引数のタイプミス検出**: 間違ったキーワード引数が渡された場合、正しい引数名の提案が表示されます。

### Free-threaded CPython([PEP 703](https://peps.python.org/pep-0703/))

グローバルインタプリタロック(GIL)を無効にしたFree-threadedモードが実験的にサポートされました。これにより、マルチコアCPUを活用してスレッドを並行実行できます。ただし、この機能はまだ実験的であり、デフォルトでは無効になっています。

- **使用方法**: `python3.13t`または`python3.13t.exe`として提供される特別な実行ファイルを使用します。
- **有効化**: [`--disable-gil`](https://docs.python.org/ja/3/using/configure.html#cmdoption-disable-gil)オプションを使用してソースからビルドするか、公式のインストーラでFree-threaded版を選択します。
- **注意点**: 現時点ではバグやシングルスレッド性能の低下が予想されます。今後のリリースで改善予定です。

### ジャストインタイム(JIT)コンパイラ([PEP 744](https://peps.python.org/pep-0744/))

実験的なJITコンパイラが追加されました。パフォーマンスの向上はまだ限定的であり、デフォルトでは無効になっています。将来的な性能向上を目指し、今後のリリースで改良される予定です。

## データモデルの改善

- **[`__static_attributes__`](https://docs.python.org/ja/3/reference/datamodel.html#type.__static_attributes__)属性の追加**：クラスボディ内の関数で`self.X`を通じてアクセスされる属性名を格納します。
- **[`__firstlineno__`](https://docs.python.org/ja/3/reference/datamodel.html#type.__firstlineno__)属性の追加**：クラス定義の最初の行番号を記録します。

## 標準ライブラリの主な変更点

- **新しい例外[`PythonFinalizationError`](https://docs.python.org/ja/3/library/exceptions.html#PythonFinalizationError)の追加**: 終了処理中に操作がブロックされた場合にこの例外が発生します。
- **[`argparse`](https://docs.python.org/ja/3/library/argparse.html#module-argparse)モジュールの拡張**: コマンドラインオプション、位置引数、サブコマンドの非推奨化がサポートされました。
- **[`base64`](https://docs.python.org/ja/3/library/base64.html)モジュールの拡張**: [`z85encode()`](https://docs.python.org/ja/3/library/base64.html#base64.z85encode)と[`z85decode()`](https://docs.python.org/ja/3/library/base64.html#base64.z85decode)関数が追加され、Z85データのエンコードとデコードが可能になりました。
- **[`copy`](https://docs.python.org/ja/3/library/copy.html#module-copy)モジュールの強化**: [`copy.replace()`](https://docs.python.org/ja/3/library/copy.html#copy.replace)関数が追加され、多くの組み込み型や[`__replace__()`](https://docs.python.org/ja/3/library/copy.html#object.__replace__)メソッドを定義したクラスでサポートされます。
- **新しい[`dbm.sqlite3`](https://docs.python.org/ja/3/library/dbm.html#module-dbm.sqlite3)モジュール**: デフォルトの[`dbm`](https://docs.python.org/ja/3/library/dbm.html#module-dbm)バックエンドとしてSQLite3が使用されます。
- **[`os`](https://docs.python.org/ja/3/library/os.html#module-os)モジュールの拡張**: Linuxのタイマ通知ファイルディスクリプタを操作する新しい関数が追加されました。
- **[`random`](https://docs.python.org/ja/3/library/random.html#module-random)モジュールのコマンドラインインターフェース**: [`random`](https://docs.python.org/ja/3/library/random.html#module-random)モジュールがコマンドラインから直接利用可能になりました。

## セキュリティの改善

- **SSLのデフォルト設定の強化**: [`ssl.create_default_context()`](https://docs.python.org/ja/3/library/ssl.html#ssl.create_default_context)がデフォルトで[`ssl.VERIFY_X509_PARTIAL_CHAIN`](https://docs.python.org/ja/3/library/ssl.html#ssl.VERIFY_X509_PARTIAL_CHAIN)と[`ssl.VERIFY_X509_STRICT`](https://docs.python.org/ja/3/library/ssl.html#ssl.VERIFY_X509_STRICT)フラグを設定するようになりました。

## C APIの改善

- **拡張モジュールのGILサポートの明示**: [`Py_mod_gil`](https://docs.python.org/ja/3/c-api/module.html#c.Py_mod_gil)スロットが、拡張モジュールがGILを無効にした実行をサポートしていることを示すために使用されます。
- **システムクロックへのアクセス**: 新しい[`PyTime`](https://docs.python.org/ja/3/c-api/time.html) C APIが追加されました。
- **軽量ミューテックス[`PyMutex`](https://docs.python.org/ja/3/c-api/init.html#c.PyMutex)の追加**: 1バイトの軽量なミューテックスが提供されました。
- **[PEP 669](https://peps.python.org/pep-0669/)のモニタリングイベントのサポート**: C APIに新しい関数群が追加され、モニタリングイベントの生成が可能になりました。

## typingの新機能

- **[PEP 696](https://peps.python.org/pep-0696/): 型パラメータのデフォルト値のサポート**: [`typing.TypeVar`](https://docs.python.org/ja/3/library/typing.html#typing.TypeVar), [`typing.ParamSpec`](https://docs.python.org/ja/3/library/typing.html#typing.ParamSpec), [`typing.TypeVarTuple`](https://docs.python.org/ja/3/library/typing.html#typing.TypeVarTuple)でデフォルト値がサポートされます。
- **[PEP 702](https://peps.python.org/pep-0702/): [`warnings.deprecated()`](https://docs.python.org/ja/3/library/warnings.html#warnings.deprecated)デコレータの追加**: 型システムと実行時に非推奨をマークするためのデコレータが追加されました。
- **[PEP 705](https://peps.python.org/pep-0705/): [`typing.ReadOnly`](https://docs.python.org/ja/3/library/typing.html#typing.ReadOnly)の追加**: [`typing.TypedDict`](https://docs.python.org/ja/3/library/typing.html#typing.TypedDict)の項目を型チェッカーで読み取り専用としてマークできます。
- **[PEP 742](https://peps.python.org/pep-0742/): [`typing.TypeIs`](https://docs.python.org/ja/3/library/typing.html#typing.TypeIs)の追加**: 型の絞り込みに直感的な挙動を提供する新しい型構築子が追加されました。

## プラットフォームサポート

- **[PEP 730](https://peps.python.org/pep-0730/): [iOSの公式サポート](https://docs.python.org/ja/3/whatsnew/3.13.html#whatsnew313-platform-support)**: AppleのiOSが[Tier 3](https://peps.python.org/pep-0011/#tier-3)プラットフォームとしてサポートされます。
- **[PEP 738](https://peps.python.org/pep-0738/): [Androidの公式サポート](https://docs.python.org/ja/3/whatsnew/3.13.html#whatsnew313-platform-support)**: Androidが[Tier 3](https://peps.python.org/pep-0011/#tier-3)プラットフォームとしてサポートされます。
- **`wasm32-wasi`のサポート**: [Tier 2](https://peps.python.org/pep-0011/#tier-2)プラットフォームとしてサポートされます。
- **`wasm32-emscripten`のサポート終了**: 公式サポートプラットフォームから除外されました。

## 重要な削除項目

### [PEP 594](https://docs.python.org/ja/3/whatsnew/3.13.html#whatsnew313-pep594): 古い標準ライブラリモジュールの削除

以下の19のモジュールが標準ライブラリから削除されました(Python 3.11で非推奨化)：

- `aifc`
- `audioop`
- `cgi`、`cgitb`
- `chunk`
- `crypt`
- `imghdr`
- `mailcap`
- `msilib`
- `nis`
- `nntplib`
- `ossaudiodev`
- `pipes`
- `sndhdr`
- `spwd`
- `sunau`
- `telnetlib`
- `uu`
- `xdrlib`

これらのモジュールの機能が必要な場合は、サードパーティのライブラリや代替手段を検討してください。

### その他の削除

- **`2to3`ツールと`lib2to3`モジュールの削除**(Python 3.11で非推奨化)
- **`tkinter.tix`モジュールの削除**(Python 3.6で非推奨化)
- **`locale.resetlocale()`関数の削除**
- **`typing.io`と`typing.re`名前空間の削除**
- **チェインされた[`classmethod`](https://docs.python.org/ja/3/library/functions.html#classmethod)デスクリプタの削除**

## リリーススケジュールの変更

[PEP 602](https://peps.python.org/pep-0602/)の更新により、新しいリリースのフルサポート期間(バグフィックス期間)が2年間に延長されました。

- **Python 3.9～3.12**: 1.5年のフルサポートと3.5年のセキュリティフィックス
- **Python 3.13以降**: 2年のフルサポートと3年のセキュリティフィックス

## 新機能の詳細

### 新しい対話型インタプリタの詳細

新しい対話型シェルは以下の利点を提供します:

- 複数行のコード編集が容易になり、履歴も保存されます。
- 標準的なコマンド(`help`, `exit`, `quit`など)が関数呼び出しなしで利用できます。
- カラー表示により、コードの読みやすさが向上します。
- F1キーでインタラクティブなヘルプが閲覧できます。
- F2キーで過去の入力履歴を効率的に参照できます。
- F3キーでペーストモードに切り替え、大量のコードブロックの貼り付けが容易になります。

### エラーメッセージ改善の詳細

- ターミナルでのトレースバックがデフォルトでカラー表示され、エラーの特定が容易になりました。
- スクリプト名が標準ライブラリやサードパーティのモジュール名と衝突している場合、具体的なエラーメッセージが表示され、問題の迅速な解決が可能です。
- 間違ったキーワード引数が渡された場合、正しい引数名が提案されるため、デバッグが容易になります。

## その他の言語変更

- **ドキュメンテーション文字列の前置ホワイトスペースの削除**: バイトコードキャッシュのサイズを削減するため、ドキュメンテーション文字列の各行の共通の前置ホワイトスペースが削除されます。
- **クラススコープ内でのラムダ式と内包表記のサポート**: クラススコープ内のアノテーションスコープでラムダ式や内包表記が利用可能になりました。
- **相対インポートによる[`__future__`](https://docs.python.org/ja/3/library/__future__.html#module-__future__)モジュールの扱いの変更**: 相対インポートによる[`__future__`](https://docs.python.org/ja/3/library/__future__.html#module-__future__)モジュールのインポートが特別な機能を有効化しなくなりました。
- **[`except`](https://docs.python.org/ja/3/reference/compound_stmts.html#except)ブロック内での[`global`](https://docs.python.org/ja/3/reference/simple_stmts.html#global)宣言の許可**: [`else`](https://docs.python.org/ja/3/reference/compound_stmts.html#else)ブロックで使用されるグローバル変数を[`except`](https://docs.python.org/ja/3/reference/compound_stmts.html#except)ブロック内で宣言できるようになりました。

## 終わりに

最後まで読んで頂きありがとうございます。不備があれば是非コメントで指摘して下さい。