2023年10月2日、Python 3.12.0がにリリースされました。毎年、10月に何かしらアップデートがされるPythonですが、今年も予定通りです。
Python 3.12.0にはいくつかの新機能や改善点が含まれており、このコンテンツではそれらの中からいくつかを紹介します。
すべての変更点を知りたい場合は、以下のリンクから追ってみてください。
今回紹介する変更点は以下です。
f
文字列distutils
、smtpd
が標準ライブラリから削除os
、pathlib
のファイルシステムサポートの向上**kwargs
の型付けPythonはもともと初心者向けの言語として認知されており、読みやすい構文が特徴の1つとされています。
今回のバージョンアップで、さらにユーザーフレンドリーになった機能の1つがエラーメッセージです。
Python 3.10では構文エラーがより正確になり、Python 3.11ではトレースバックによって問題のあるコードを特定するのがより快適になりました。
Python 3.12では、エラーメッセージを改良することで、開発者体験を向上させる努力が続けられています。
まず、インポートエラーから紹介します。以下のコードをインタプリタやPythonファイルから実行してみましょう。
これは以下のエラーを出力します。
glob
をインポートせずに使用すると従来と同じくNameError
が発生しますが、さらに追加でglob
のインポートを忘れていないかを聞いてくれます。
インポート忘れのリマインダーは標準ライブラリモジュールに対してのみ発生します。プロジェクトにインストールしたサードパーティモジュールには発生しません。
次に、構文エラーに近しいですが、インポート時の別エラーメッセージについて紹介します。
以下を書いてみましょう。
以下のように出力されます。
TypeScriptなどと違って、Pythonではfrom
から始める必要があることを教えてくれます。
さらに、以下のケースでも改良されています。
あえてsearch
をsearc
とタイポしています。これは以下のように出力されます。
限定的ではありますが、簡単なタイポであれば検出できるようになっています。
最後にクラス内で定義したインスタンス変数についてのエラーメッセージです。以下のようなクラスを書いてみましょう。
これは以下のようなエラーメッセージを出力します。
インスタンス変数にname
が存在することを解釈し、name
の代わりにself.name
を提案してくれます。
f
文字列書式付き文字列、略してf
文字列はPEP498とPython 3.6で導入されました。以下のようなコードであれば、特に今回のアップデートにおける改善は関係なく使えます。
ただし、今までのf
文字列には問題点がありました。""
(ダブルクォーテーション)で""
(ダブルクォーテーション)は囲めないのです。
たとえば、以下のコードではエラーが出ます。
\
(バックスラッシュ)を使っても解決できません。
Pyhton 3.12.0では、f
文字列内で""
を使えるようになりました。
また、これまではf
文字列の中で\
(バックスラッシュ)を使用できませんでした。3.12.0からは、f
文字列でもバックスラッシュを使用できます。
さらに中括弧内の改行にも対応しており、コメントも追加できます。
これによって、変数展開を必要とする長めの文字列を作成する際、とても便利になりました。
Pythonはバージョン3.0で関数アノテーションをサポートしました。その後、Python 3.5から静的型付けをサポートするようになりました。
型引数はPythonの型付けシステムの重要で強力な部分を構成しています。
型引数は、静的型チェックの際に具体的な型の代わりとなります。型引数は、ジェネリッククラスやジェネリック関数をパラメータ化するために使います。次の例では、与えられたリストの最初の要素を返します。
get_head()
の返り値の型は、渡すリストに依存しています。例えば、params
が整数のリストならget_head()
はint
を返し、文字列のリストならstr
を返します。
この関係性を表現するために型変数を使います。
Python 3.12では型引数の新しい構文が導入されました。新しい構文を使うと、次のように書けます。
関数定義に角括弧でT
を追加することで、get_head()
が型変数T
をパラメータとする汎用関数であることを宣言しています。
このように、より厳密なコーディングをサポートしているため、Pythonで弱点だった(弱点とされていた)動的型付けをまた一歩改善しています。
Python 3.12.0では、抜本的な改革こそありませんが、逆に言えば破壊的な変更もありませんでした。
成熟したプログラミング言語として、より精密かつ細かなところに手が届きやすいプログラミング言語としての進展と言えるでしょう。
Pythonはプログラミング初心者から熟練者まで使う言語であることから、シンプルな構文を捨てることなく、こういったより練度の高い方法で書けるのはありがたいことです。
まだライブラリのサポート等が追いついていないケースもありますが、今後のPython 3.12.x系に注目していきたいところです。