Python typehintテクニック
Kazuki Moriyama (森山 和樹)
あるクラスの中でそのクラスを型として使用したい
Pythonではクラス定義の中で、そのクラス自身の名前を参照することができません。そのため、型定義も同じ問題に直面します。
class Dog:
def me(self) -> Dog: # エラー
...
クラスのメソッドで、そのメソッドが返す値の型をDog
クラス自身にしたい場合、上記のように書くとエラーになります。
解決策は型を文字列として指定してあげる
型の指定において、クラス自身の名前を文字列として指定することで、エラーを回避できます。
class Dog:
def me(self) -> 'Dog': # 成功
...
これにより、Dog
クラスのメソッドでDog
クラス自身を返すような型定義を行うことができます。
インスタンスではなくクラスの型を指定したい
通常、型を指定するとインスタンスの型として認識されますが、クラス自身の型を指定したい場合があります。
class User:
...
def say(user: User):
...
say(User()) # OK
say(User) # エラー
上記の例では、say
関数にUser
クラスの型を指定しようとするとエラーになります。
Type
キーワードを使う
クラス自身の型を指定してあげるにはクラス自身の型を指定する場合は、Type
キーワードを使用します。
class User:
...
def say(user: Type[User]):
...
say(User()) # エラー
say(User) # OK
Type[User]
と指定することで、User
クラス自身を引数として渡すことができるようになります。
型をキャストしたいとき
cast
関数を使って、値を特定の型にキャストすることができます。
from typing import cast
cast(int, "not int")
上記の例では、"not int"
を整数型にキャストしています。
どうしても型を通せないとき
時には、型を明示的に指定してもエラーが発生する場合があります。そのような場合は、ignore
を使って型の指定を無視することができます。
def complex_return_type(): ... # type: ignore
上記の例では、complex_return_type
関数の型指定が無視されます。これを利用すると、一時的に型の指定を省略することができます。ただし、ignore
は使いすぎると型チェックの恩恵を受けられなくなるため、慎重に使用する必要があります。