我有一个(嵌套)列表理解,并从 mypy 收到错误。
在我的列表理解中,我正在迭代一个列表,该列表保证仅包含两种类型的实例(不实现相同的基础;在下面的示例中称为
A
和 B
)。
两种类型的实例都保证具有相同的属性name
,我在列表理解中使用了该属性。 Mypy 无法自动推断列表的类型,仅考虑列表的内容 objects
(仅公共基础),因此警告属性 name
未在 object
的实例中定义。
我将代码分解为以下示例:
from dataclasses import dataclass
from typing import Union, Set, List
@dataclass
class A:
name: str
@dataclass
class B:
name: str
# Approach 1:
c: Union[A, B]
f : Set[str] = {c.name for c in [A('1'), B('2')]} # error: "object" has no attribute "name" [attr-defined]
# Approach 2:
d: List[Union[A, B]] = [A('1'), B('2')]
g : Set[str] = {c.name for c in d} # No issue!
在方法2中,mypy没有报告错误。为什么会这样,为什么方法 1 中
c
的类型提示不够充分?
可悲的是,在我的实际用例中,列表
d
只是中间的(没有名称),我无法像方法 2 中那样输入提示。有没有办法提示 mypy 访问 name
实际上是可行的不需要将列表理解转换为循环?
我使用的是python3.8。