🐍

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

2024/10/09に公開

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

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

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

この記事では、Python 3.13のリリースノートに基づき、前バージョン(Python 3.12)からの主な変更点や新機能を解説します。

ハイライト

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

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

さらに、エラーメッセージが引き続き改善され、トレースバックがデフォルトでカラー表示されるようになりました。また、locals()組み込み関数の動作が明確化され、型パラメータにデフォルト値がサポートされるようになりました。

インタプリタの改善

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

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

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

新しい対話型シェルを無効にするには、環境変数PYTHON_BASIC_REPLを設定してください。

エラーメッセージの改善

  • カラー付きトレースバック: ターミナルでのトレースバックがデフォルトでカラー表示されます。環境変数PYTHON_COLORS, NO_COLOR, FORCE_COLORで制御可能です。
  • モジュール名の衝突に関する警告: ユーザースクリプトが標準ライブラリやサードパーティのモジュール名と衝突している場合、より具体的なエラーメッセージが表示されます。
  • キーワード引数のタイプミス検出: 間違ったキーワード引数が渡された場合、正しい引数名の提案が表示されます。

Free-threaded CPython(PEP 703)

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

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

ジャストインタイム(JIT)コンパイラ(PEP 744)

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

データモデルの改善

  • __static_attributes__属性の追加:クラスボディ内の関数でself.Xを通じてアクセスされる属性名を格納します。
  • __firstlineno__属性の追加:クラス定義の最初の行番号を記録します。

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

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

セキュリティの改善

C APIの改善

  • 拡張モジュールのGILサポートの明示: Py_mod_gilスロットが、拡張モジュールがGILを無効にした実行をサポートしていることを示すために使用されます。
  • システムクロックへのアクセス: 新しいPyTime C APIが追加されました。
  • 軽量ミューテックスPyMutexの追加: 1バイトの軽量なミューテックスが提供されました。
  • PEP 669のモニタリングイベントのサポート: C APIに新しい関数群が追加され、モニタリングイベントの生成が可能になりました。

typingの新機能

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

  • PEP 730: iOSの公式サポート: AppleのiOSがTier 3プラットフォームとしてサポートされます。
  • PEP 738: Androidの公式サポート: AndroidがTier 3プラットフォームとしてサポートされます。
  • wasm32-wasiのサポート: Tier 2プラットフォームとしてサポートされます。
  • wasm32-emscriptenのサポート終了: 公式サポートプラットフォームから除外されました。

重要な削除項目

PEP 594: 古い標準ライブラリモジュールの削除

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

  • aifc
  • audioop
  • cgicgitb
  • 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.iotyping.re名前空間の削除
  • チェインされたclassmethodデスクリプタの削除

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

PEP 602の更新により、新しいリリースのフルサポート期間(バグフィックス期間)が2年間に延長されました。

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

新機能の詳細

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

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

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

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

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

その他の言語変更

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

終わりに

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

注) この記事は私のQiitaの記事をコピーしたものになります。

Discussion