由于某些性能原因,我重新实现了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
但我很想找到一种更美的方式。
谢谢你的回答。
1条答案
按热度按时间nfeuvbwi1#
我使用
class.__instancecheck__
找到了一个更好的解决方案,它允许我在调用内置isinstance
时使用修改后的版本。