型アノテーションに自己のクラスを指定できない
list_node.py
class ListNode:
def __init__(self, val: int, next: ListNode):
self.val = val
self.next = next
例えば、上記(片方向連結リストのコンストラクタ)のように型アノテーションを書くと、ListNodeが定義されていないと警告が表示される。
undefined name 'ListNode'
Python3.7以上の場合: from __future__ import annotations
を使用する
list_node.py
from __future__ import annotations
class ListNode:
def __init__(self, val: int, next: ListNode):
self.val = val
self.next = next
assert ListNode.add.__annotations__ == {
'next': 'ListNode'
}
Python3.7未満の場合: 文字列を使用する
Python3.7未満ではfrom __future__ import annotations
を使用できないため、文字列を使用する。
list_node.py
class ListNode:
def __init__(self, val: int, next: 'ListNode'):
self.val = val
self.next = next
参考
- The problem of forward declarations | PEP 484 -- Type Hints | Python.org
- 前方参照の問題 - [翻訳] PEP 0484 -- 型ヒント (Type Hints) - Qiita
- python - How do I type hint a method with the type of the enclosing class? - Stack Overflow
- Self-reference or forward-reference of type annotations in Python - Stack Overflow
- Python - pythonの型ヒントで自作クラスを指定したい|teratail