您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

打字。任何对象?

打字。任何对象?

是,有一点不同。尽管在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是另一种类型,可以将任意类型的实例作为值。与不同Anyobject是普通的静态类型(类似于ObjectJava),并且对象值仅接受对所有类型均有效的操作。

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]
其他 2022/1/1 18:31:32 有364人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶