說明一下 TYPE_CHECKING 的功能, 主要功能是避免 python 循環引用以及讓 IDE 支援靜態檢查.
from typing import TYPE_CHECKING先來看一個例子 module_a.py
from module_b import ClassB
class ClassA:
def __init__(self, b: ClassB) -> None:
self.b = b
def use_b(self) -> None:
print("Using ClassB from ClassA")from module_a import ClassA
class ClassB:
def __init__(self, a: ClassA) -> None:
self.a = a
def use_a(self) -> None:
print("Using ClassA from ClassB")當你執行 main.py 的時候, 會出現循環引用
from module_a import ClassA
from module_b import ClassB
a = ClassA(None)
b = ClassB(a)
b.use_a()那我們應該如何避免循環引用以及同時有 typing hint 的檢查呢 ❓
這時候介紹 TYPE_CHECKING
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from module_b_fix import ClassB
class ClassA:
def __init__(self, b: "ClassB") -> None:
self.b = b
def use_b(self) -> None:
print("Using ClassB from ClassA")注意修改的地方, 首先, TYPE_CHECKING = False 預設是 False,
只有在 IDE 的部份才會是 True, 然後需要把 ClassB 加上雙引號變成 "ClassB",
同理, module_b_fix.py 一樣的修正方式.
修改完後的 main_fix.py 就可以正常的執行.