Pythonの型ヒントを使った型宣言パターン(変数、関数、独自型、numpy…)
Pythonのプログラムでは型宣言は必須ではありませんが、型ヒントを利用することでコードの可読性と保守性を大幅に向上させることができます。この記事では、Pythonでの型ヒントの書き方を、変数、関数、独自型、numpyなどのライブラリについて紹介します。
Pythonでも型の指定は可能
Pythonでは、変数の型を明示的に定義する必要はありません。そのため、ついつい型を指定せずにコードを書いてしまいがちです。
しかし、Python 3.5からは「型ヒント」という型を宣言する仕組みが導入されています。これを使えば、コードに型を明示的に記述することができます。
型を記述しておけば、他人と共有するプログラムや後で再利用するプログラムの可読性が大幅に向上します。
「コードの可読性向上」を図るために、型指定を意識して行うことが重要です。
この記事では、Pythonで型を指定する方法について詳しく解説します。
Pythonでは型定義ではなく「型ヒント」と呼ぶようです
あくまでもヒントであり、型が間違っていても特にエラーが出るわけではありません
この記事で紹介するのは、Python3.9以降の書き方です。
Pythonの組み込み型
まずは、Pythonの組み込み型について説明します。Pythonでよく使う組み込み型には、以下のものがあります。
組み込み型 | 説明 |
---|---|
bool | 真偽値 |
int | 整数 |
float | 浮動小数点数 |
list | リスト |
tuple | タプル |
str | 文字列 |
set | 集合型 |
dict | 辞書型 |
これらの組み込み型について、型を明示することを考えます。
型の宣言
Pythonでは、以下のプログラムのように型を宣言せずに変数を定義することが可能です。
a = 10
print(a)
# 10
しかし、型宣言を行うことで、コードの可読性や保守性が向上します。以下、Pythonで型宣言を行う方法について解説します。
ちなみに、上記のプログラムは型宣言を行うと以下のようになります。
a : int = 10
print(a)
# 10
変数の型ヒント
変数の型宣言は以下のようになります。
:
の後に型名をつけるだけです。
<変数名>:<型>
変数の宣言例:
>>> a : int = 10
>>> a
10
>>> d:dict = {'a':10, 'b':20}
>>> d
{'a': 10, 'b': 20}
>>> l:list = [1,2,3,4,5]
>>> l
[1, 2, 3, 4, 5]
関数の型ヒント
関数の引数、戻り値の型については以下のように宣言します
引数は:
をつけて型をしていまします。また、戻り値は->
に続けて型を宣言します。
def <関数名>(<変数名>:<型>...) -> <戻り値の型>
関数の宣言例:
>>> def f(a :int, b :int) -> int :
... return a+b
...
>>> f(10,20)
30
型ヒントなので、別の型を入れても動作してしまいます。例えば、上の例で文字列を入れても問題なく動いてしまいます。
型チェックをしたい場合は、VSCodeなどのエディタでプラグインを導入すると良いです。
>>> def f(a :int, b :int) -> int :
... return a+b
...
>>> f("test", "1234")
'test1234'
関数(戻り値が複数の場合の型ヒント)
関数の戻り値が複数の場合は、タプル(tuple
)を使います。
具体的には、以下のようなコードになります
def f(a:int, b:int) -> tuple[int, int]:
return a+b, a-b
print(f(10,20))
# (30, -10)
関数(引数、戻り値が任意の型の場合の型ヒント)
変数の型を「任意」にしたい場合にはAny
を使います。
Any
はtyping
ライブラリをインポートすることで使うことができます。
from typing import Any
def f(a:Any, b:Any) -> Any:
return a+b
print(f(10,20))
# (30, -10)
print(f("a","b"))
# ab
独自の型を用いた型ヒント
独自の型を作成し、独自の型を指定することも可能です。
この場合は、typing
ライブラリのNewType
を使って以下のようにします。
以下のコードでは、MyInt
という型をNewType
を使って作成し、型指定に利用しています。
from typing import NewType
MyInt = NewType('MyInt', int)
def f(x:MyInt) :
if x == 0: print("zero")
f(0)
# zero
numpyなどへの型ヒント
numpy
などのライブラリの型も指定することが可能です。
numpy
などの型指定は以下のようにして行います。
>>> import numpy as np
>>> x:np.array = np.array([1,2,3,4])
>>> x
array([1, 2, 3, 4])
>>> type(x)
<class 'numpy.ndarray'>
nptypingというライブラリを使う方法もあります。そちらを使う方法もあります。
まとめ
以上、Pythonで型ヒントをつける方法について解説しました。
型を明示的に指定しなくてよいので、ついつい型を指定せずに記述してしまいますが、特に複数人で共同作業する場合や、再利用するコードを書く場合には型宣言をやっておいた方が可読性があがりますので良いと思います。