为什么 mypy 不接受 list[str] 作为 list[Optional[str]]?

lor*_*org 7 python type-hinting mypy python-typing

示例1:

from typing import List, Optional

def myfunc() -> List[Optional[str]]:
    some_list = [x for x in "abc"]
    return some_list
Run Code Online (Sandbox Code Playgroud)

Mypy对示例 1 进行了抱怨:

不兼容的返回值类型(得到“List[str]”,预期为“List[Optional[str]]”)

然而,这个例子没有得到任何抱怨

示例2:

def myfunc() -> List[Optional[str]]:
    some_list = [x for x in "abc"]
    return list(some_list)
Run Code Online (Sandbox Code Playgroud)

不一致行为的解释是什么?

lor*_*org 6

因为在 Python 中列表是不变的(请参阅此处此处的示例)。

如果我们传递List[str]给期望的人List[Optional[str]],那么有人可能会None在我们的列表中添加 a 并打破我们的假设。然而,第二个示例是有效的,因为list()return 语句中的输出没有保存在任何地方,并且没有人可以依赖于非法改变的返回值。