python の typing モジュールの Type
についてご存知でしょうか。これは、クラス自体に対しての型ヒントに使えるものです。
ところで、私が初めてこれについて調べようと思った際、 "python typing.Type" といったキーワードで検索してみました。しかし、その際に検索結果として主に表示されたのは python の型ヒント全般に関する記事でした。そのため、所望の情報にたどりつい着くまでに少々苦労しました。そこで python の公式ドキュメントの typing のページを見直したところ、 こちら に書いてました。(やはり最初に公式ドキュメントをしっかり読むべきですね。)
今回、 typing.Type
について簡単にまとめたく、本記事を作成しました。
typing.Type とは
下記、 日本語版公式ドキュメント からの引用です。
Type[C] と注釈が付けられた変数は、そのクラス自身を受理します
つまり、 Type
は、自作クラス自体や、 int
などの組み込みの型(クラス)自体を指し示すために使われます。
使用例
全く実用性のない例になりますが、簡単のため、下記のような例を作成しました。
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 と併用する場合の使用例を下記のように作成しました。
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
の型は str
、 type_
は int
または float
自身であり、 type_
が int
自身の際の返り値の型は int
、 type_
が float
自身の際の返り値の型は float
である。
そのため、 to_number
関数を呼び出す際は、 to_number("10", int)
のように呼び出します。
まとめ
typing.Type は、クラス自体を示す型ヒントとして用いられる。
以上です。閲覧ありがとうございました!