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
有特定原因吗?
- 引发类型错误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()
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"
我想知道为什么 Python 的输入模块不支持 isinstance(<obj>, Any)
并引发 TypeError
。我希望它总是 return True
。为什么它并不总是 return True
有特定原因吗?
- 引发类型错误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()
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"