【发布时间】:2019-11-06 08:58:01
【问题描述】:
在 Pycharm 中,以下代码会产生警告:
from typing import List
list1: List[int] = [1, 2, 3]
list2: List[str] = ["1", "2", "3"]
list3: List[object] = list1 + list2
# ↳ Expected type List[int] (matched generic type List[_T]),
# got List[str] instead.
为什么?我不应该连接两个混合的暗示类型列表吗?
【问题讨论】:
-
对相同类型的对象使用列表是很常见的。混合内容不是错误,但我认为它的风格不好。
-
@Matthias 为什么风格不好?假设我想要一个
objects(或某些超类型)列表并且需要分段构建它(子类型列表)——有没有首选的方法? -
如果将
list1和list2注释为List[object]类型会怎样?这使得你的程序至少在 mypy 下进行类型检查——也许它也会满足 Pycharm。 -
@Michael0x2a 这确实消除了警告,但它没有回答“为什么”......例如,如果
list1和list2本身没有类型提示,但是被分配了带有提示返回类型的函数的输出(例如def gli() -> List[int]: return [1, 2, 3]然后list1 = gli()),我仍然收到警告。如果这些函数是库代码怎么办?为什么连接它们的输出会不好? -
我认为这就是 list 类型签名的定义方式——例如请参阅 typeshed 中的 signature for
list.__add__,这是 stdlib 的类型提示的规范集合。类型签名可能会被扩展(例如重载以接受List[S]并返回List[Union[T, S]])但我怀疑这种东西在实践中并不太有用,并且对于想要严格同质列表或想要子类化它们。
标签: python python-3.x pycharm type-hinting