0Pricing
Python Academy · レッスン

typing.NamedTuple

名前付きタプルに型ヒントを追加します

「typing.NamedTuple」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

型付きの代替手段

typing.NamedTuple基底クラスは、名前付きタプルを定義するための、現代的なクラスベースの方法です。型ヒントが追加され、通常のクラスと同じように読めるため、ファクトリ形式よりも多くのエディターや型チェッカーで適切に扱えます。

クラスベースの構文

NamedTupleをサブクラス化し、各フィールドを型アノテーション付きで宣言します。結果は通常のタプルのままです。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(1, 2)
print(p)

同じタプルの動作

ファクトリ形式の機能はすべて引き続き使えます。名前によるアクセス、インデックスによるアクセス、アンパック、イミュータビリティが利用できます。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(1, 2)
print(p.x, p[1])
x, y = p
print(x, y)

インラインでのデフォルト値

クラス本体で値を代入するだけで、フィールドにデフォルト値を設定できます。デフォルト値を持つフィールドは、デフォルト値を持たないフィールドの後に置く必要があります。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int
    z: int = 0

print(Point(1, 2))
print(Point(1, 2, 9))

メソッドの追加

クラスなので、実際のメソッドを追加できます。これはcollections.namedtupleファクトリでは簡単にはできないことです。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

    def distance_sq(self):
        return self.x ** 2 + self.y ** 2

print(Point(3, 4).distance_sq())

プロパティも定義可能

フィールドから値を計算するプロパティも定義できます。

from typing import NamedTuple

class Rectangle(NamedTuple):
    width: int
    height: int

    @property
    def area(self):
        return self.width * self.height

print(Rectangle(3, 4).area)

ヘルパーメソッドも引き続き使用可能

おなじみのタプル用ヘルパーも引き続き利用できます。_replace()、_asdict()、_fieldsはすべて同じように動作します。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

p = Point(1, 2)
print(p._asdict())
print(p._replace(x=9))

型ヒントで意図を明示

アノテーションは実行時には強制されませんが、想定する型を明示できます。また、mypyなどのツールを使って、プログラムを実行する前に間違いを検出できます。

from typing import NamedTuple

class Employee(NamedTuple):
    name: str
    salary: float
    active: bool = True

e = Employee('Alice', 5000.0)
print(e)

NamedTupleとdataclassの比較

次の基準で選択します。

  • NamedTuple:イミュータブルでタプルに似ており、インデックスによるアクセスとアンパックに対応します。
  • dataclass:デフォルトではミュータブル(またはfrozen)で、インデックスによるアクセスには対応せず、より多くの設定項目があります。
  • タプルの動作が重要ならNamedTupleを、より豊富なレコードが必要ならdataclassを選びます。

ネストと構成

名前付きタプルはうまく組み合わせられます。フィールドを別の名前付きタプルにして、構造化されたイミュータブルなデータを構築できます。

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int

class Line(NamedTuple):
    start: Point
    end: Point

line = Line(Point(0, 0), Point(3, 4))
print(line.end.y)

関数の戻り値の型として使う

関数がNamedTupleを返すようにアノテーションを付けると、エディターが結果のフィールドの型を把握できます。このアノテーションによって、返されるレコードの構造も明示できます。

from typing import NamedTuple

class Stats(NamedTuple):
    minimum: int
    maximum: int

def analyze(nums) -> Stats:
    return Stats(min(nums), max(nums))

r = analyze([5, 2, 8])
print(r.minimum, r.maximum)

確認問題

collections.namedtupleファクトリと比べたとき、typing.NamedTupleにはどのような利点がありますか?

まとめ

名前付きタプルに型ヒントを追加する方法を学びました。

  • フィールドにアノテーションを付けてtyping.NamedTupleをサブクラス化します。
  • デフォルト値はインラインで設定し、メソッドやプロパティを追加できます。
  • ヘルパーの_replace、_asdict、_fieldsも引き続き機能します。
  • 可読性とツールのサポートを重視するなら、ファクトリ形式よりこちらを優先します。

よくある質問

「typing.NamedTuple」レッスンは無料ですか?

はい。「typing.NamedTuple」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「typing.NamedTuple」で何を学びますか?

名前付きタプルに型ヒントを追加します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「typing.NamedTuple」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Enumクラス
  2. IntEnumとFlag
  3. NamedTupleの基礎
  4. typing.NamedTuple
← Python Academyに戻る