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,但我也对需要更高版本的解决方案感兴趣。

  1. 通过使用 typing.TYPE_CHECKING 标志修复循环导入,仅在类型检查期间导入 C

  2. 这使得 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"