Python 函数类型检查

Python type checking for functions

我在弄清楚如何标记函数以进行类型检查时遇到了一些问题。假设我有以下情况:

class BaseClass:
    def __init__(self):
        self.name = 'base'


class MainClass(BaseClass):
    def __init__(self):
        self.mc_val = 1
        super().__init__()


def base_func(bc: BaseClass) -> BaseClass:
    bc.name = 'altered'
    return bc


def main_func(mc: MainClass) -> MainClass:
    mc.mc_val = 3
    return mc

mc = MainClass()
mc1 = base_func(mc)
mc2 = main_func(mc1)

这在我的类型检查器 (Pycharm) 中引发了一个问题,因为我告诉它 mc1 是 BaseClass 的一个实例,而不是 MainClass,因此它不适合 main_func.

所以我需要 base_func 接受 BaseClass 类型的参数(包括子类),但 return 不是 BaseClass 而是与最初输入的类型相同。我可以让 BaseClass 都采用 return,比如 TypeVar('T') 或类似的,但这首先违背了类型检查的要点。

非常感谢任何帮助!

您可能需要一个有界类型变量:

import typing
class BaseClass:
    def __init__(self):
        self.name = 'base'


class MainClass(BaseClass):
    def __init__(self):
        self.mc_val = 1
        super().__init__()

T = typing.TypeVar('T', bound=BaseClass)
def base_func(bc: T) -> T:
    bc.name = 'altered'
    return bc


def main_func(mc: MainClass) -> MainClass:
    mc.mc_val = 3
    return mc

mc = MainClass()
mc1 = base_func(mc)
mc2 = main_func(mc1)

使用mypy:

juan$ mypy test_typing.py
Success: no issues found in 1 source file