在鸭子类型内容的列表理解中键入暗示 mypy

问题描述 投票:0回答:0

我有一个(嵌套)列表理解,并从 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。

python-3.x type-hinting mypy duck-typing
© www.soinside.com 2019 - 2024. All rights reserved.