Jac*_*ers 3 type-hinting python-3.x mypy python-typing
我正在尝试创建一个函数,它接受哺乳动物列表或动物列表作为参数。
这是我的代码
from typing import Union, List
class Animals():
pass
class Mammels(Animals):
pass
def add_mammel(x : List[Union[Animals, Mammels]]):
x.append(Mammels())
l = [Mammels(), Mammels()]
add_mammel(l)
print(l)
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但是当我用 mypy 检查它时,我得到以下内容
python -m mypy fourth.py
fourth.py:11: error: Argument 1 to "add_mammel" has incompatible type "List[Mammels]"; expected "List[Union[Animals, Mammels]]"
fourth.py:11: note: "List" is invariant -- see http://mypy.readthedocs.io/en/latest/common_issues.html#variance
fourth.py:11: note: Consider using "Sequence" instead, which is covariant
Run Code Online (Sandbox Code Playgroud)
这个问题与“方差”有关,但我无法弄清楚这真正意味着什么。
问题确实是差异。如果您不知道这意味着什么,请阅读文档的这一部分mypy。
mypy分析代码时,它会推断lto be的类型List[Mammels],它是比 更窄的类型List[Union[Animals, Mammels]],因为后者可以包含Animals对象。函数的注释表明列表包含的能力Animals很重要,因此它表示当您传递更受限制的类型时会出现错误。
正如错误消息中链接的文档页面所建议的,一个简单的解决方法是显式注释 的类型l,使其与函数建议的内容相匹配:
l: List[Union[Animals, Mammels]] = [Mammels(), Mammels()]
Run Code Online (Sandbox Code Playgroud)
您无法从使用替代建议中受益,Sequence因为List您的函数正在改变传递给您的列表(并且Sequence是不可变类型)。