对于python静态类型/mpy,我可以说;此方法的类型签名与方法X“相同/相似”;?

对于python静态类型/mpy,我可以说;此方法的类型签名与方法X“相同/相似”;?,python,mypy,Python,Mypy,我试图重写初始值设定项方法,但没有从基方法复制所有静态类型: 类基类: 定义初始化(self,*,消息:str,错误代码:int): self.message=消息 self.error\u code=错误\u code 类子类(基类): 定义初始值(self,*,详细信息:str,**kwargs): 超级() self.details=详细信息 我真的不想为了得到参数的静态检查而将基类的签名复制到子类中。是否可以向static typing/mypy指示子类。是在基类中声明的参数/类型。

我试图重写初始值设定项方法,但没有从基方法复制所有静态类型:

类基类:
定义初始化(self,*,消息:str,错误代码:int):
self.message=消息
self.error\u code=错误\u code
类子类(基类):
定义初始值(self,*,详细信息:str,**kwargs):
超级()
self.details=详细信息
我真的不想为了得到参数的静态检查而将
基类的签名复制到
子类中。是否可以向static typing/mypy指示
子类。
是在
基类中声明的参数/类型。

在阅读了文档和文档之后,我找不到一个语法或“委托键入”模型来支持这一点

理想情况下,我希望使用如下代码来引发mypy错误/警告:

子类(message=“foo”,error\u code=13,details=“badness”,stack\u trace=[1,2,3])
子类不接受名为“stack_trace”的参数。

简短回答:

在您的特定情况下,可以使用数据类告诉mypy kwargs:

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版本,您还可以删除
\uuuuu init\uuuu
代码并一直使用数据类。

您无论如何都不想复制它们,因为使用
kwargs
的目的是捕获编译时不知道的参数。
super
的用例是“太”动态的,无法完全应用静态类型检查。@针对这个确切用例的chepner签名复制是一个可接受的功能请求:不,这绝对不是kwargs的唯一要点。