在解决如何标记用于类型检查的功能时遇到了一些问题。假设我有以下情况:
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')或类似的东西,但是这首先使类型检查的目的败了。
任何帮助都将不胜感激!
答案 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