Python 使用导入的 class 方法键入提示
Python type hints with imported class methods
为了将一个大的class分割成多个文件,this answer,建议在class
级别使用import
命令来加载定义可以是移动到其他模块。作为一个最小的例子,
class_def.py
:
class C:
from _methods import m
_methods.py
:
def m(self):
return "hello"
通常,大多数 IDE 特征代码补全将识别某些 class 中定义的函数作为绑定方法,并且 self
将自动识别为具有以下类型定义方法的 class 。不幸的是,在上述情况下,我没有在 class 内部定义 m
。只看 _methods.py
是不可能知道 self
应该有类型 C
.
在 m
的定义中,如果我插入以 self.
开头的行,我的 IDE 无法建议 m
或我可能拥有的任何其他方法在 C
.
中实施
显而易见的解决方案是添加类型提示:
from class_def import C
def m(self: C):
return "hello"
但是现在我们有一个循环导入:C
的定义导入 _methods
,但是 _methods
导入 C
。如何在不引入循环导入的情况下创建类型提示?
我目前使用的是 Python 3.7,但我也对需要更高版本的解决方案感兴趣。
通过使用 typing.TYPE_CHECKING
标志修复循环导入,仅在类型检查期间导入 C
。
这使得 C
的值在运行时未定义。用引号括起来 ("C"
) 或导入 __future__.annotations
:
_methods.py
变体 1:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from class_def import C
def m(self: "C"):
return "hello"
_methods.py
变体 2:
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from class_def import C
def m(self: C):
return "hello"
为了将一个大的class分割成多个文件,this answer,建议在class
级别使用import
命令来加载定义可以是移动到其他模块。作为一个最小的例子,
class_def.py
:
class C:
from _methods import m
_methods.py
:
def m(self):
return "hello"
通常,大多数 IDE 特征代码补全将识别某些 class 中定义的函数作为绑定方法,并且 self
将自动识别为具有以下类型定义方法的 class 。不幸的是,在上述情况下,我没有在 class 内部定义 m
。只看 _methods.py
是不可能知道 self
应该有类型 C
.
在 m
的定义中,如果我插入以 self.
开头的行,我的 IDE 无法建议 m
或我可能拥有的任何其他方法在 C
.
显而易见的解决方案是添加类型提示:
from class_def import C
def m(self: C):
return "hello"
但是现在我们有一个循环导入:C
的定义导入 _methods
,但是 _methods
导入 C
。如何在不引入循环导入的情况下创建类型提示?
我目前使用的是 Python 3.7,但我也对需要更高版本的解决方案感兴趣。
通过使用
typing.TYPE_CHECKING
标志修复循环导入,仅在类型检查期间导入C
。这使得
C
的值在运行时未定义。用引号括起来 ("C"
) 或导入__future__.annotations
:
_methods.py
变体 1:
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from class_def import C
def m(self: "C"):
return "hello"
_methods.py
变体 2:
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from class_def import C
def m(self: C):
return "hello"