SHOEISHA iD

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

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

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

Pythonの新機能を知ろう!

【Python 3.12への道のり】3.11で導入された可変長ジェネリクス・データクラス変換とは?型関連の機能を紹介

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

dataclassのおさらいとデータクラス変換の活用

 データクラス(dataclass)ではないがそのように振る舞うクラスの型チェックのために、Python 3.11ではデータクラス変換(dataclass_transform)が導入されました。これにより、特別なプラグインなどを必要とせずに、dataclassのようなクラスであることを静的型チェックツールに伝えることができます。

dataclassとは?

 dataclass_transformの意義に入る前に、まずはdataclassについておさらいしましょう。dataclassは、Python 3.7で導入された、データ格納のためのクラスのデコレータです(デコレータについては第1回を参照してください)。@dataclassでデコレートされたクラスや関数には、データ格納用として静的型チェックツールに認識されるほか、さまざまな関数が自動生成されるなどのメリットが生まれます。以下のリストでは、Personクラスに引数付きの__init__関数、__eq__関数、__repr__関数などが生成され、クラス自体にフィールドを2個記述するだけで引数付きコンストラクタ、インスタンスの内容での比較、形式化された表示などが利用できるようになります。

リスト dataclass.py
from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

# 引数付きのコンストラクタ
p = Person(name = "Nao", age = 60)
# __eq__関数の生成で内容の比較が可能
print(p == Person(name = "Nao", age = 60))	# 実行結果:True
# __repr__関数の生成で内容の表示が可能
print(p)				# 実行結果:Person(name='Nao', age=60)

データクラス変換

 このようにdataclassは便利ですが、これはあくまでも自前でデータクラスを実装するときの話です。Djangoなどの実装する独自のモデルクラスは、あくまでもデータクラスライクというだけで、そのままでは静的型チェックは働きません。そこで、そういったものでも静的型チェックツールの恩恵を受けやすくするように、データクラス変換(typing.dataclass_transform)が導入されました。

 @dataclass_transformデコレータをクラスや関数に付与すると、静的型チェックツールはそれが@dataclassでデコレートされたものと同様に振る舞うというように解釈します。これにより、特別なプラグインなどを必要とせずに静的型チェックのメリットを受けられるようになります。

 以下のリストでは、@dataclass_transform()デコレータを付与されたBaseDataクラスが@dataclassと同様に振る舞うものとして、それを継承するPersonクラスにおいても引数付きのコンストラクタが存在する、というように静的型チェックツールは判断します。

リスト dc_transform.py
from typing import dataclass_transform

@dataclass_transform()			(1)
class BaseData:
    pass

class Person(BaseData):			(2)
    name: str
    birth: int

c1 = Person()               # mypyでMissing positional argumentsのエラー
c2 = Person("Nao", 1970)
c3 = Person("Yamauchi")     # mypyでMissing positional argumentsのエラー

 2個のフィールドのための引数が指定されているもの以外は、mypyによるチェックではMissing positional argumentsのエラーとなります。もちろん、実際に引数付きのコンストラクタが定義されているわけではないので、実行時にはc2の宣言でエラーになります。

 @dataclassにはよらない独自のデータクラスでも、静的型チェックツールの恩恵を受けやすくなるので、ライブラリ製作者の間で利用が進んでいくと思われます。

まとめ

 今回は、Python 3.10以降の新機能のうち、Python 3.11で導入された可変長ジェネリクス、Self型、改良されたTypedDict、文字列リテラル型、データクラス変換を紹介しました。

 次回は、型関連の機能としていよいよPython 3.12でサポートされたジェネリクスのための新しい型引数構文、**kwargsのより精密な型付け、静的型付けのためのオーバーライドデコレータなどを紹介します。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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(コードジン)
https://codezine.jp/article/detail/18532 2023/10/31 11:00

イベント

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

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

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

メールバックナンバー