Pythonのクラス関数で、型ヒントとして自分自身のクラスを指定したい

Python のクラス関数で、型ヒントとして自分自身のクラスを指定しようとすると、未定義な文字列としてエラーになります。型ヒントで自分自身のクラスを指定するには、クラス名を文字列にします。

目次

クラスの静的関数で、自分自身のクラスを型タイプに書きたい

以下の Member クラスがあるとします。Member クラスは、カンマ区切りの文字列を受け取ってList['Hoge']を返す静的クラス関数generate_from_csvを持っています。

from typing import List

class Member():
    name: str

    def __init__(self, name: str):
        self.name = name

    @staticmethod
    def generate_from_csv(names: str):
        hoges = []
        for name in names.split(','):
            hoges.append(Member(name))

        return hoges

このとき、generate_from_csv()の戻り値の型を指定しようとしてdef generate_from_csv(names: str): -> List[Member]と書くと、未定義エラー"Member" is not definedになります。Member クラス自身の定義中に、Member クラスを参照しようとしているからですね。

Forward references を使う

エラーを回避するためには、Forward references という書き方を使います。PEP(Python Enhancement Proposal、Python の新機能に関する仕様の説明や解説)のPEP 484 – Type Hintsに説明が書かれています。以下は、説明のソースコードの引用です。

class Tree:
    def __init__(self, left: Tree, right: Tree):
        self.left = left
        self.right = right
class Tree:
    def __init__(self, left: 'Tree', right: 'Tree'):
        self.left = left
        self.right = right

クラスをクラスとしてではなく、文字列として書きます。

最初に示した Members クラスでも、def generate_from_csv(names: str): -> List['Member']とすればエラーを回避しつつ型ヒントが使えます。






Amazon欲しいものリスト

私が作業中に飲んでいるコーヒーや欲しいマンガなどを集めました。開発・執筆の励みになりますのでクリックして頂ければ幸いです。

<Amazon欲しいものリスト>