Pythonでアノテーションを使う(typing.Annotated, Python 3.9以降)
この記事では、Python 3.9以降で導入されたtyping.Annotatedを使って型ヒントに付加情報を追加する方法を解説します。アノテーションを活用することで、より高度で分かりやすい型ヒントを記述し、コードの可読性と保守性を向上させましょう。
目次
typing.Annotatedの概要
typing.Annotatedは、型ヒントにメタデータを付加するための機能です。型ヒントに付加情報を持たせることで、静的解析ツールやIDEによるコードチェックをより詳細に行うことができます。これにより、実行時エラーを減らし、コードの信頼性を高めることが期待できます。Python 3.9以降で利用可能です。
from typing import Annotated
# Annotatedの基本的な構文
value: Annotated[int, "これはメタデータです"] = 10
基本的な使い方
Annotatedの第一引数は型ヒント、第二引数以降はメタデータです。メタデータは文字列、数値、タプルなど、様々な型を使用できます。
from typing import Annotated, List
# 型ヒントと複数のメタデータ
value: Annotated[int, 'positive', 10] = 5
# リストへのアノテーション
values: Annotated[List[str], 'lowercase'] = ['apple', 'banana']
メタデータの利用例
メタデータは、様々な目的に利用できます。例えば、データの単位、許容範囲、デフォルト値などを指定できます。
from typing import Annotated
# 単位を指定
length: Annotated[float, 'meters'] = 2.5
# 許容範囲を指定
age: Annotated[int, 'range(0, 120)'] = 30
バリデーションへの応用
メタデータを利用してバリデーションを実装することも可能です。例えば、Pydanticのようなバリデーションライブラリと組み合わせると効果的です。
from typing import Annotated
from pydantic import BaseModel, ValidationError
class User(BaseModel):
age: Annotated[int, 'gt(18)']
try:
user = User(age=20)
print(user)
except ValidationError as e:
print(e)
実践例:データクラスと組み合わせる
データクラスと組み合わせることで、より複雑なデータ構造に対して型ヒントとメタデータによるバリデーションを実現できます。
from dataclasses import dataclass
from typing import Annotated
@dataclass
class Product:
name: Annotated[str, 'min_length=3']
price: Annotated[float, 'ge(0)']
product = Product(name='abc', price=10.0)
print(product)
まとめ
typing.Annotatedは、型ヒントにメタデータを付加することで、コードの可読性、保守性、信頼性を向上させる強力な機能です。バリデーションライブラリと組み合わせることで、より堅牢なアプリケーション開発に役立ちます。積極的に活用し、より高品質なコードを目指しましょう。
関連記事
- Pythonで関数に型ヒントをつける (Python 3.5以降)
- Pythonでデータクラスを使う(dataclasses.dataclass, Python 3.7以降)
- Pythonで名前付きタプルを使う(collections.namedtuple, typing.NamedTuple (Python 3.6以降))
- PythonでEnumを使う(enum.Enum)
- Pythonでプロパティを使う(@property, @setter, @deleter)
- Pythonで特殊メソッドを使う(__str__, __repr__, __add__ など)
- PythonでOrderedDictを使う(collections.OrderedDict (Python 3.6まで), typing.OrderedDict (Python 3.7以降))
- Pythonでクラスを定義(class)
- Pythonでコンストラクタを定義(__init__)
- Pythonでクラスのインスタンスを作成