1,233 views
B!0X

Python typehintテクニック

python-typehint

あるクラスの中でそのクラスを型として使用したい

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は使いすぎると型チェックの恩恵を受けられなくなるため、慎重に使用する必要があります。

関連事例

  • データ分析支援

    事例:過去実績を提案に活用する分析の仕組み

    広告代理店との取り組みです。同社は過去実績の示唆を次の提案へ反映し、結果をどのように予測したか、その背景まで提案先のクライアントへ説明できるようになりました。KDOT は案ごとの見込みと判断材料を比較できる仕組みを業務アプリとして実装しました。さらに業務アプリの中核となる処理ロジックと機械学習モデルについて、特許手続きを担う弁理士が技術の新規性や工夫を検討するための資料を作成しました。その後この発明には特許が付与されました。

  • データ基盤構築 / 技術顧問(技術企業向け)

    事例:効果検証の分析処理基盤

    効果検証を提供する分析会社との取り組みです。同社は分析者の人数に比例してしか売上と利益を伸ばせない事業の形を、効果検証をプロダクトとして提供することで変革しようとしていました。手法とモデルは同社のまま、社内では開発できなかった、データと機械学習の重い推定を製品として動かす仕組みの開発を、開発支援会社の KDOT に任せました。推定を案件ごとの手作業ではなくシステムで実行できるようになったことで、同社は人数に比例しない形で売上と利益を伸ばすことを目指せるようになりました。

開発の相談先をお探しですか。

この記事に関わることについてご相談がある方はお問い合わせください。

KDOT についてお問い合わせ