Pythonは動的型付けのプログラミング言語ですが、3.5から型ヒント(Type Hints)が導入されました。型ヒントは静的型付け言語のように型によるチェックができるようになる一方で、実行時には影響を及ぼしません。つまり型ヒントはアノテーションです。
この記事では、型ヒントに含まれているUnion
とTypeVar
の違いについて説明します。
UnionとTypeVarの基本
Union
は「str or int」のように「いくつかのある型のうちいずれか」にマッチすればOKという型ヒントです。一方、TypeVar
はジェネリクスの型変数を定義するための型ヒントです。
from typing import TypeVar, Union
U = Union[str, int]
T = TypeVar("T", str, int)
def test_union(p: U): pass
def test_typevar(p: T): pass
test_union(1) # OK
test_union("union") # OK
test_union(None) # NG
test_typevar(2) # OK
test_typevar("typevar") # OK
test_typevar(None) # NG
上記のコードでは、test_union
とtest_typevar
という2つの関数を定義しています。それぞれの関数は、引数としてUnion
またはTypeVar
を使用しています。
UnionとTypeVarの違い
Union
とTypeVar
の主な違いは、Union
が複数の型を許容するのに対し、TypeVar
は同じ型を必要とする点です。
from typing import TypeVar, Union
U = Union[str, int]
T = TypeVar("T", str, int)
def test_union(p1: U, p2: U): pass
def test_typevar(p1: T, p2: T): pass
test_union(1, 2) # OK
test_union("union", "onion") # OK
test_union(1, "onion") # OK
test_typevar(1, 2) # OK
test_typevar("typevar", "foobar") # OK
test_typevar(1, "foobar") # NG
上記のコードでは、test_union
関数は引数p1
とp2
が異なる型でも問題ありません。一方、test_typevar
関数は引数p1
とp2
が同じ型であることを要求します。
まとめ
Pythonの型ヒントは、コードの可読性と安全性を向上させるための重要なツールです。Union
とTypeVar
は、型ヒントの中でも特に重要な概念で、それぞれが提供する柔軟性と厳密性を理解することは、効果的な型ヒントの使用にとって重要です。