3

DictWithOnlyX在 attrs 数据类中有一个 TypedDict Example,其中 mypy 抱怨从getdict()我的类的方法返回的类型,即使声明了返回类型:

from typing_extensions import TypedDict
from attr import attrs, attrib, Factory, fields

DictWithOnlyX = TypedDict('DictWithOnlyX', {"x": str})

@attrs
class Example(object):
    name: str = attrib(default="")
    dx = attrib(factory=DictWithOnlyX)

    def getdict(self) -> DictWithOnlyX:
        return self.dx  # <-- mypy compains

mypy 抱怨error: Incompatible return value type (got "DictWithOnlyX", expected "DictWithOnlyX")

具有讽刺意味的是,当通过声明的类型来解决 mypy 问题时,attrib()我得到了另一个 mypy 错误 - 打个痣!

@attrs
class Example(object):
    name: str = attrib(default="")
    dx: DictWithOnlyX = attrib(factory=DictWithOnlyX)  # <-- mypy compains

    def getdict(self) -> DictWithOnlyX:
        return self.dx

mypy 抱怨error: Incompatible types in assignment (expression has type "DictWithOnlyX", variable has type "DictWithOnlyX")

上述代码的两个版本都运行良好。蟒蛇 3.7.5。

两条错误消息都很神秘,因为它们看起来自相矛盾——(据报道)相同的类型怎么可能是“不兼容的”?

4

1 回答 1

0

对我来说,这看起来像是一个 mypy 错误。但令我惊讶的是它的效果如此之好,因为您完全避开了 attrs 的打字支持!定义类的惯用方式是

@attrs(auto_attribs=True)
class Example(object):
    name: str = ""
    dx: DictWithOnlyX = Factory(DictWithOnlyX)

但这会导致相同的错误消息。

于 2020-01-06T06:46:09.897 回答