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