8
8

More than 1 year has passed since last update.

クラス自体に対しての型ヒントに使える python の typing.Type

Posted at

python の typing モジュールの Type についてご存知でしょうか。これは、クラス自体に対しての型ヒントに使えるものです。

ところで、私が初めてこれについて調べようと思った際、 "python typing.Type" といったキーワードで検索してみました。しかし、その際に検索結果として主に表示されたのは python の型ヒント全般に関する記事でした。そのため、所望の情報にたどりつい着くまでに少々苦労しました。そこで python の公式ドキュメントの typing のページを見直したところ、 こちら に書いてました。(やはり最初に公式ドキュメントをしっかり読むべきですね。)

今回、 typing.Type について簡単にまとめたく、本記事を作成しました。

typing.Type とは

下記、 日本語版公式ドキュメント からの引用です。

Type[C] と注釈が付けられた変数は、そのクラス自身を受理します

つまり、 Type は、自作クラス自体や、 int などの組み込みの型(クラス)自体を指し示すために使われます。

使用例

全く実用性のない例になりますが、簡単のため、下記のような例を作成しました。

type.py
from typing import Type


class Person:
    @staticmethod
    def get_cls_name() -> str:
        return "Person"


def get_cls_name(cls: Type[Person]) -> str:
    return cls.get_cls_name()

Person クラスにクラス名を返す staticmethod を定義し、その外に、get_cls_name 関数を定義しています。

※もちろん、クラス名は cls.__name__ で取得すれば良いです。また、 Person.get_cls_name はリテラル値を返すので、アノテーションを Literal["Person"] とした方が良いです。

get_cls_name の型ヒント get_cls_name(cls: Type[Person]) -> str は、下記を意味します。

get_cls_name 関数の引数 cls は( Person のインスタンスではなく) Person 自身であり、返り値の型は str である。

そのため、 get_cls_name 関数を呼び出す際は、 get_cls_name(Person) のように呼び出します。

TypeVar との併用

TypeVar 自身については、 こちら に簡単な記事を作成しましたので、適宜ご参照ください。

TypeVar と併用する場合の使用例を下記のように作成しました。

typevar_and_type.py
from typing import Type, TypeVar

Number = TypeVar("Number", int, float)


def to_number(str_number: str, type_: Type[Number]) -> Number:
    return type_(str_number)

to_number の型ヒント to_number(str_number: str, type_: Type[Number]) -> Number は、下記を意味します。

to_number 関数の引数 str_number の型は strtype_int または float 自身であり、 type_int 自身の際の返り値の型は inttype_float 自身の際の返り値の型は float である。

そのため、 to_number 関数を呼び出す際は、 to_number("10", int) のように呼び出します。

まとめ

typing.Type は、クラス自体を示す型ヒントとして用いられる。

以上です。閲覧ありがとうございました!

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8