TypeError: typing.Any cannot be used with isinstance()

TypeError: typing.Any cannot be used with isinstance()

我想知道为什么 Python 的输入模块不支持 isinstance(<obj>, Any) 并引发 TypeError。我希望它总是 return True。为什么它并不总是 return True 有特定原因吗?

>>> from typing import Any
>>> isinstance(1, Any)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/peter/miniconda3/envs/prefect_utils/lib/python3.9/typing.py", line 338, in __instancecheck__
    raise TypeError(f"{self} cannot be used with isinstance()")
TypeError: typing.Any cannot be used with isinstance()

Any class 文档字符串似乎说明了原因:

"""Special type indicating an unconstrained type.

- Any is compatible with every type.
- Any assumed to have all methods.
- All values assumed to be instances of Any.

Note that all the above statements are true from the point of view of
static type checkers. At runtime, Any should not be used with instance
or class checks.
"""

def __instancecheck__(self, obj):
    raise TypeError("Any cannot be used with isinstance().")

def __subclasscheck__(self, cls):
    raise TypeError("Any cannot be used with issubclass().")

将这些对象视为实际实例或子class可能会导致问题,如果它们没有提供实例或子[=]的确切内容18=]应该。相反,它们“伪造”了这样一个事实:它们可以是任何东西,但不会在类型层次结构中以这种方式被对待而造成损害。

键入中的大多数内容并非用于运行时类型检查。大多数类型无法动态地进行明智的检查,因此键入避免假装它是可能的。


Any 类型不是正确的类型——它在任何用法中都与任何类型兼容。根据用途,它可以是另一种类型的超类型和子类型。
最突出的是,Any 支持所有操作。因此,isinstance(x, Any) == True 意味着 x 支持 所有 操作,而不管 x 的具体类型。这对大多数正确的类型来说是不明智的。


例如,考虑将整数检查为“Any 的实例”,这意味着它支持切片:

x = 3
if isinstance(x, Any):  # x supports any operation in this block
    print(x[:3])        # slicing is part of "all operations"