提问人:mutableVoid 提问时间:7/28/2023 最后编辑:Daniil FajnbergmutableVoid 更新时间:8/2/2023 访问量:85
在鸭子类型内容的列表推导中键入提示 mypy
Type hinting mypy in list comprehension over duck-typed content
问:
我有一个(嵌套的)列表推导式,并收到来自 mypy 的错误。
在我的列表理解中,我正在迭代一个列表,该列表保证仅包含两种类型的实例(不实现相同的基础;在下面的示例中称为 和)。
这两种类型的实例都保证具有我在列表推导中使用的相同属性。Mypy不能自动推断列表的类型,只考虑列表的内容(只有公共基础),因此警告说,该属性未在实例中定义。A
B
name
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
可悲的是,在我的实际用例中,该列表只是中间的(没有名称),我无法像方法 2 那样键入提示。有没有办法暗示 mypy 访问实际上是可行的,而无需将列表推导转换为循环?d
name
我正在使用python3.8。
答: 暂无答案
评论
A
B
A
B