是的,有区别。尽管在 Python 3 中,所有对象都是 object 的实例,包括 object 本身,但只有 Any 记录了类型检查器应忽略返回值。
Any 类型的文档字符串表明 object 是 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.
然而,一个适当的类型检查器(一个超越 isinstance() 检查,并检查对象在函数中实际使用的方式)可以很容易地反对 object,其中 Any 是总是被接受。
来自Any type documentation:
请注意,将 Any 类型的值分配给更精确的类型时,不会执行类型检查。
和
将Any 的行为与object 的行为进行对比。与Any 类似,每个类型都是object 的子类型。但是,与Any 不同的是,相反的情况并非如此:对象不是所有其他类型的子类型。
这意味着当一个值的类型为object时,类型检查器将拒绝对其进行的几乎所有操作,并将其分配给更专业类型的变量(或将其用作返回值)是一种类型错误。
来自 mypy 文档部分 Any vs. object:
object 类型是另一种类型,它可以将任意类型的实例作为值。与Any不同,object是一个普通的静态类型(类似于Java中的Object),对象值只接受对所有类型都有效的操作。
object 可以是 cast 到更具体的类型,而 Any 真正意味着 任何事情都发生 并且类型检查器会脱离对对象的任何使用(即使您稍后分配这样的经过类型检查的名称的对象)。
您已经通过接受list 将您的函数绘制成一个未键入的角落,这归结为与List[Any] 相同。类型检查器在此处脱离并且返回值不再重要,但由于您的函数接受包含Any 对象的列表,因此正确的返回值将是Any。
要正确参与类型检查代码,您需要将输入标记为List[T](一个通用类型的容器),以便类型检查器能够关心返回值。在您的情况下是T,因为您正在从列表中检索一个值。从TypeVar 创建T:
from typing import TypeVar, List
T = TypeVar('T')
def get_item(L: List[T], i: int) -> T:
return L[i]