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欲しいものリスト>