【发布时间】:2021-09-02 23:12:14
【问题描述】:
我想知道为什么 Python 的打字模块不支持isinstance(<obj>, Any) 并引发TypeError。我希望它总是返回True。为什么它并不总是返回True,是否有特定原因?
- 引发了 TypeError here。
- TypeError 示例:
>>> 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()
【问题讨论】:
-
因为如果答案总是
True,你为什么要首先做这个检查? -
如果你想要一个任何对象都将被视为
isinstance的实例的类型,请考虑object。 -
@deceze:这种逻辑会让我相信 dunder 检查会无条件返回 true,不会引发异常。我认为这样做可能会产生不良影响。
-
打字中的大多数东西都不是用于运行时类型检查的。任何也不例外。大多数类型不能准确地动态检查,所以打字避免假装它是可能的。
-
@deceze :因为我在运行时检查各种类型(不仅包括
Any),以检查给定对象是否确实是给定类型。在这种情况下,isinstance(obj, Any)返回True而不是引发异常是有意义的。这也是imo让它始终返回True的正当理由。