Python 中的 TypeVar

问题描述 投票:0回答:2

我在 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也没有报错

python type-hinting mypy type-variables
2个回答
1
投票

您已将

ls
注释为
List[Any]
Any
是 Mypy 的逃生口,告诉它不要类型检查,并接受对对象的任何操作。例如,

x: Any = 3
x + "foo"

类型检查就好了。如果您删除

List[Any]
提示,或将其更改为
list[object]
list[int | str | tuple[str]]
(Python 3.10+ 语法),您会收到预期的错误。

这个问题的答案可能会有帮助。


0
投票

Python 是一种动态类型的语言,这意味着在运行时不强制执行类型注释(Python 文档)。

在这里,这意味着您的类型注释不会阻止您将元组列表传递给

first()
,即使类型注释建议只允许
int
str
类型。

© www.soinside.com 2019 - 2024. All rights reserved.