是,有一点不同。尽管在Python 3中,所有对象都是的实例(
object包括
object自身),但只有
Any文档指出类型检查器应忽略返回值。
该
Any类型文档字符串指出对象是类的子类
Any,反之亦然:
>>> import typing>>> print(typing.Any.__doc__)Special type indicating an unconstrained type. - Any object is an instance of Any. - Any class is a subclass of Any. - As a special case, Any and object are subclasses of each other.
然而,适当的typechecker(一个超越
isinstance()检查,并且检查对象如何被实际 使用
中的功能)可以容易地反对
object,其中
Any总是接受。
从
Any类型文档中:
请注意,将类型的值分配给
Any更精确的类型时,不会执行任何类型检查。
和
将的行为
Any与的行为进行对比object。类似于Any,每种类型都是的子类型object。但是,与Any相反,情况并非如此:object不是其他所有类型的子类型。这意味着,当值
object的类型为时,类型检查器将拒绝对其执行的几乎所有 *** 作,并将其分配给更专门类型的变量(或将其用作返回值)是类型错误。
从mypy文档部分 Any vs.
object :
该类型
object是另一种类型,可以将任意类型的实例作为值。与不同Any,object是普通的静态类型(类似于ObjectJava),并且对象值仅接受对所有类型均有效的 *** 作。
object可以投给一个更具体的类型,而
Any实际上意味着
任何事情都会发生 ,并从任何使用对象的类型检查脱离(即使你后来这样一个对象分配给一个名字 是 typechecked)。
通过接受
list,您已经将函数绘制到一个没有类型的角落,归结为与相同
List[Any]。类型检查器在 那里脱离
,返回值不再重要,但是由于您的函数接受包含
Any对象的列表,因此
Any此处将是正确的返回值。
为了正确地参与类型检查的代码,您需要将输入标记为
List[T](通用类型的容器),以使类型检查器能够关心返回值。在您的情况下,这是
T因为您正在从列表中检索值。
T从创建
TypeVar:
from typing import TypeVar, ListT = TypeVar('T')def get_item(L: List[T], i: int) -> T: return L[i]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)