SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Pythonの新機能を知ろう!

Python 3.15の新機能――明示的な遅延インポートとイミュータブルな辞書型などを解説

Pythonの新機能を知ろう! 第8回

WINGSプロジェクト 山内 直[著] / 山田 祥寛[監修]

型付き追加項目を持つ型付き辞書

 Python 3.15では、TypedDictにクラス引数closedとextra_itemsが追加され、定義にないキーをどのように扱うか指定できるようになりました。

 TypedDictは、辞書のキーと値の型を定義するための仕組みです。通常は、定義にないキーが実行時の辞書に含まれることも許容されますが、closed=Trueを指定すると、型チェッカーに対して定義済みのキー以外を認めないことを示せます。次の例では、nameとbirth以外のキーを禁止しています。

リスト typeddict.py
from typing import TypedDict

class Person(TypedDict, closed=True):
    name: str
    birth: int

person: Person = {"name": "Nao", "birth": 1982}
#person: Person = {"name": "Nao", "birth": 1982, "gender": "male"}	型チェックでエラー
print(person)	# {'name': 'Nao', 'birth': 1982}

 この例では、Personに定義されていないgenderキーを指定すると、型チェッカーがエラーを報告します。ただし、これは実行時に辞書への追加が禁止されるという意味ではありません。あくまでも、型チェッカーに制限を伝えるためのクラス引数です。

 一方、extra_itemsを指定すると、定義にないキーの追加を許可しつつ、その値の型を制限できます。以下の例では、追加キーの値をstr型に制限しています。

リスト typeddict.py
class PersonWithExtras(TypedDict, extra_items=str):
    name: str
    birth: int

person2: PersonWithExtras = {
    "name": "Nao",
    "birth": 1982,
    "gender": "male",
}
print(person2)		# {'name': 'Nao', 'birth': 1982, 'gender': 'male'}

 この例では、nameの値はstr型、birthの値はint型である必要があります。それらに加えて、定義にないキーも指定できますが、その値はextra_items=strで指定したとおり、str型でなければなりません。追加キーは必須ではないため、省略することもできます。

 なお、closedとextra_itemsは、同じTypedDict定義で同時に指定することはできません。

型注釈・型式を表す値を注釈するための新しい型

 Python 3.15ではtyping.TypeForm[T]が追加され、Tを表す型注釈・型式を値として受け取ることを示す型を利用できるようになりました。

 ここでTは、intといったクラスを始め、共用体(int | str)やジェネリック型(list[int])のような型表現も使うことができます。従来からあるtype[T]は、T型のインスタンスを受け取ることを示すものであり、型式を受け取ることを示すTypeForm[T]とは目的が異なります。TypeForm[T]の導入により、型表現を受け取る関数の入力と型の対応を、型チェッカーが確認できるようになります。

 以下のリストは、型式を受け取る関数について、それがintしか受け入れないことを示す例です。

リスト typeform.py
from typing import Literal, TypeForm

def show_type(form: TypeForm[int]) -> None:
    print(form)

show_type(int)		# intはOK
show_type(str)		# strはNG。型チェッカーがエラーにする

 以下のリストは、共用体やジェネリック型、Literal型も表わせることを示す例です。

リスト typeform.py
target1: TypeForm[int | str] = int | str		# 共用体型
target2: TypeForm[list[int]] = list[int]		# ジェネリック型
target3: TypeForm[Literal["Good"]] = Literal["Good"]	# Literal型
print(target1)		# int | str
print(target2)		# list[int]
print(target3)		# typing.Literal['Good']

 ここで、target1などに代入しているのは、int | str型やlist[int]型の通常のデータ値ではなく、それぞれの型を表す値です。このような型形式値を受け取る関数も、たとえば以下のように注釈できます。

def inspect_type[T](target: TypeForm[T]) -> None:
    ...

 この例では、型パラメーターTを使って、引数targetが表す型と、TypeFormの型引数との対応を示しています。TypeFormを使うことで、型表現を受け取る関数のインタフェースを、より正確に型注釈できるようになります。

まとめ

 今回は、明示的な遅延インポートlazy import、イミュータブルな辞書型frozendict、センチネル値生成のための型sentinel、内包表記における拡張されたアンパック構文など、言語仕様の強化を中心に紹介しました。

 次回は、新しいプロファイリングパッケージとTachyon、エラーメッセージの改善やヘルプのカラー化、デフォルトエンコーディングのUTF-8への変更など、インタプリタや言語インタフェースの強化を中心に紹介します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Pythonの新機能を知ろう!連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)

<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー