我在 Jupyter Notebook 中运行了以下代码:
%load_ext nb_mypy
from typing import Any, List, Union, TypeVar
T = TypeVar("T",int,str)
def first(container: List[T]) -> T:
return container[2]
ls: List[Any] = [1,"hello",("hello",)]
first(ls)
结果是:
('hello',)
在这里,我限制了变量
T
只代表str
或int
类型。然后,我约束了函数的container
参数。我以为container里面的元素只能是int或者str,但是当我尝试传递一个包含元组的列表ls
时,mypy并没有报错。我不明白为什么。
List[T]
不是说容器只能包含T
类型的变量吗?这里我也把函数的返回值约束为T
类型,但是好像没有效果,函数还是返回一个元组,mypy也没有报错
您已将
ls
注释为 List[Any]
。 Any
是 Mypy 的逃生口,告诉它不要类型检查,并接受对对象的任何操作。例如,
x: Any = 3
x + "foo"
类型检查就好了。如果您删除
List[Any]
提示,或将其更改为 list[object]
或 list[int | str | tuple[str]]
(Python 3.10+ 语法),您会收到预期的错误。
这个问题的答案可能会有帮助。
Python 是一种动态类型的语言,这意味着在运行时不强制执行类型注释(Python 文档)。
在这里,这意味着您的类型注释不会阻止您将元组列表传递给
first()
,即使类型注释建议只允许int
和str
类型。