【问题标题】:mypy ignores wrong type in dataclass membermypy 忽略数据类成员中的错误类型
【发布时间】:2021-11-29 12:23:38
【问题描述】:

此代码包含一个巨大的类型错误,mypy 错过了:

from dataclasses import dataclass

class WrongThing:
    def do_wrong_way(self):
        pass

class RightThing:
    def do_right_way(self):
        pass

@dataclass
class Holder:
    thing: RightThing
    def fill_thing(self):
        self.thing.do_wrong_way()  # <--- This is wrong

m = Holder(RightThing())
m.fill_thing()

为什么 mypy 不反对 self.thing 缺少 do_wrong_way 属性?我做错了什么,呃,错了吗?

mypy 确实正确地用 [attr-defined] 错误标记此代码:

r = RightThing()
r.do_wrong_way()   # <--- [attr-defined] error

【问题讨论】:

    标签: python-3.x type-hinting mypy python-typing python-dataclasses


    【解决方案1】:

    让这成为一个教训永远不要不注释函数定义,即使它看起来微不足道!

    Mypy 传递此代码是因为 MyPy 的默认设置是忽略“没有类型注释”的函数,因为假定用户希望这些是用户不希望进行类型检查的“动态函数”。这在文档here 中有所提及。

    在您的Holder 类中,您在fill_thing 方法的签名中根本没有注释,所以mypy 根本不看它。如果您将 Holder 类更改为此,则 fill_thing 被显式注释为返回 None:

    @dataclass
    class Holder:
        thing: RightThing
        def fill_thing(self) -> None:
            self.thing.do_wrong_way()
    

    ...然后是 Mypy raises an error,正如我们所期望的那样!


    以后如何避免这些错误

    我建议始终使用 --strict 设置运行 mypy,如果您保留任何没有类型注释的函数,则使用 strict=True、MyPy will warn you。虽然默认设置“如果您不为函数添加注释,我们不会引发错误”可能对初学者更友好,但我个人认为,如果您不将 Mypy 与 --strict 一起使用,它只会导致不幸的错误数量设置。

    另一个选项,如果您希望检查未注释的函数,但不希望 MyPy 像 --strict 选项那样严格相当,则运行 MyPy the --check-untyped-defs option。完整的命令行选项列表可以在文档here 中找到。

    【讨论】:

    • 所以这就是为什么我看到这么多函数示例注释-&gt; None!
    • @BenKovitz 是的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2017-11-16
    • 2019-08-28
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多