我试图覆盖一个初始化方法,但不从基本方法中复制所有静态类型:
class BaseClass:
def __init__(self, *, message: str, error_code: int):
self.message = message
self.error_code = error_code
class SubClass(BaseClass):
def __init__(self, *, details: str, **kwargs):
super().__init__(**kwargs)
self.details = details
我真的不必为了将参数进行静态检查而将BaseClass.__init__
的签名复制到SubClass.__init__
中。是否可以向静态类型输入/ mypy指示SubClass.__init__(**kwargs)
是BaseClass.__init__
中声明的参数/类型?
在阅读了python typing文档和mypy cheat-sheet
之后,我无法找到一种语法或“委托类型”模型来允许这种情况理想情况下,我希望使用类似以下的代码来引发mypy错误/警告:
SubClass(message="foo", error_code=13, details="badness", stack_trace=[1, 2, 3])
SubClass不接受名称为“ stack_trace”的参数。
答案 0 :(得分:0)
简答:no, there is an open feature request。
在特定情况下,您可以使用数据类告诉mypy有关kwarg的信息:
MYPY = False
if MYPY:
from dataclasses import dataclass
@dataclass
class BaseClass:
message: str
error_code: int
@dataclass
class SubClass(BaseClass):
details: str
else:
class BaseClass:
def __init__(self, *, message: str, error_code: int):
self.message = message
self.error_code = error_code
class SubClass(BaseClass):
def __init__(self, *, details: str, **kwargs):
super().__init__(**kwargs)
self.details = details
上面的代码使用最新的mypy进行类型检查,并检测到您的类的用法不正确,并且仍在没有数据类的Python版本上运行。您可以将数据类定义放入.pyi
文件中以启用对Python 2的支持。
如果您可以删除较旧的Python版本,也可以摆脱__init__
代码并完全使用数据类。