python-3.x 如何编写isinstance的签名(带类型收缩)

0yg35tkg  于 2023-04-22  发布在  Python
关注(0)|答案(1)|浏览(116)

由于某些性能原因,我重新实现了isinstance内置函数,并进行了一些修改,以便在我的约束下工作得更快。现在我试图通过添加适当的签名来让我的函数满意。isinstance函数的签名应该是什么?
我找到了一种处理简单情况的方法,其中第二个参数是类型。

T = TypeVar("T")

def constrained_isinstance(obj: Any, cls: Type[T]) -> TypeGuard[T]:
    pass  # let's not bother about implementation

但是,我找不到一种方法来为类型的元组case(例如:isinstance(pet, (Dog, Cat))).我考虑过使用TypeVarTuple;我得到的最接近的解是这个签名:

T = TypeVarTuple("T")

def constrained_isinstance(obj: Any, types: tuple[*T]) -> TypeGuard[Union[*T]]:
    pass

这是一个错误的解决方案,因为缩小的类型将是Union[Type[Cat], Type[Dog]]而不是Union[Cat, Dog]
可能有一种方法可以显式地定义几个元素的类型,比如Types[*T],但是我找不到它。
PS:一个解决方法是在存根文件中写入以下内容:

constrained_isinstance = isinstance

但我很想找到一种更美的方式。
谢谢你的回答。

nfeuvbwi

nfeuvbwi1#

我使用class.__instancecheck__找到了一个更好的解决方案,它允许我在调用内置isinstance时使用修改后的版本。

相关问题