是,有一点不同。尽管在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
是普通的静态类型(类似于Object
Java),并且对象值仅接受对所有类型均有效的操作。
object
可以投给一个更具体的类型,而Any
实际上意味着任何事情都会发生 ,并从任何使用对象的类型检查脱离(即使你后来这样一个对象分配给一个名字 是 typechecked)。
通过接受list
,您已经将函数绘制到一个没有类型的角落,归结为与相同List[Any]
。类型检查器在 那里脱离 ,返回值不再重要,但是由于您的函数接受包含Any
对象的列表,因此Any
此处将是正确的返回值。
为了正确地参与类型检查的代码,您需要将输入标记为List[T]
(通用类型的容器),以使类型检查器能够关心返回值。在您的情况下,这是T
因为您正在从列表中检索值。T
从创建TypeVar
:
from typing import TypeVar, List
T = TypeVar('T')
def get_item(L: List[T], i: int) -> T:
return L[i]