pexels-photo-1476321.jpeg

Python typehintテクニック

 
0
このエントリーをはてなブックマークに追加
Kazuki Moriyama
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は使いすぎると型チェックの恩恵を受けられなくなるため、慎重に使用する必要があります。

info-outline

お知らせ

K.DEVは株式会社KDOTにより運営されています。記事の内容や会社でのITに関わる一般的なご相談に専門の社員がお答えしております。ぜひお気軽にご連絡ください。