🐍

Python 3.12主な新機能をまとめてみた

2023/06/19に公開

はじめに

直近Python 3.12のベータ版3.12.0b2をリリースしました。RC版は7月31日にリリース予定です。
Python 3.12では新しい機能がいくつか追加され、全体的なパフォーマンスが向上しました。
ここでは、いくつかの新しい構文特性を紹介します。

1. エラーメッセージの可読性が向上

Python 3.11以前では、モジュールがインポートされていないというエラーメッセージが表示され、下記のようにエラーの理由だけが表示されます。

>>> sys.version_info
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined

Python 3.12では、エラーの理由だけでなく、修正のヒントも表示されます。

>>> sys.version_info
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'?

2. PEP 701: f-stringsの構文の形式化

f-stringは、Python 3.6で導入された文字列のフォーマット方法で、フォーマット文字列リテラルとも呼ばれています。
古いフォーマット方法と比べると、これは非常にシンプルです。Python 3.12では、その機能がさらに強化されました。

>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
>>> f"This is the playlist: {", ".join(songs)}"
'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

上記コードは、Python 3.11では構文エラーとなります。
文字列内に同じ引用符を同時に存在させることは許されていません。外側が二重引用符の場合、内側は単引用符を使用する必要があります。例えば:

>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
'2'

可読性の観点からすると、ちょっと見づらくなりましたね。

3. PEP 692: TypedDictを使用した**kwargsのより精密な型付け

PEP 484によって導入された関数シグネチャにおける**kwargsの型付けは、全ての**kwargsが同じ型である場合にのみ有効なアノテーションを許可していました。

Python 3.12では、型付け辞書に依存することで**kwargsの型付けをより精確にする方法を指定しています:

from typing import TypedDict, Unpack

class Movie(TypedDict):
  name: str
  year: int

def foo(**kwargs: Unpack[Movie]): ...

詳細はPEP 692を参照してください。

4. PEP 698: 静的型付けのためのオーバーライドデコレータ

新しいデコレータtyping.override()が導入されました。
これは、メソッドがスーパークラスのメソッドをオーバーライドすることを意図していることを型チェッカーに示します。

# Python 3.12
from typing import override

class Base:
  def get_color(self) -> str:
    return "blue"

class GoodChild(Base):
  @override  # ok: overrides Base.get_color
  def get_color(self) -> str:
    return "yellow"

class BadChild(Base):
  @override  # type checker error: does not override Base.get_color
  def get_colour(self) -> str:
    return "red"

Discussion