使用python静态类型输入/ mpy,我可以说“此方法与方法X具有相同/相似的类型签名”吗?

时间:2019-06-27 16:47:38

标签: python mypy

我试图覆盖一个初始化方法,但不从基本方法中复制所有静态类型:

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”的参数。

1 个答案:

答案 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__代码并完全使用数据类。