功能的Python类型检查

时间:2020-01-14 03:38:20

标签: python python-3.x types typing

在解决如何标记用于类型检查的功能时遇到了一些问题。假设我有以下情况:

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类型的参数(包括子类),但不返回BaseClass而是返回与最初输入的类型相同的类型。我可以让BaseClass都接受并返回,例如TypeVar('T')或类似的东西,但是这首先使类型检查的目的败了。

任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:4)

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

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