如何对 Python 中对象的 属性 执行类型保护

How can I perform a type guard on a property of an object in Python

PEP 647 引入了类型保护以使用函数执行复杂的类型缩小操作。如果我有一个 class,其中属性可以有多种类型,有没有一种方法可以对作为函数参数给定的对象的 属性 执行类似的类型缩小操作?

class MyClass:
    a: Optional[int]
    b: Optional[str]
    # Some other things

def someTypeGuard(my_obj: MyClass) -> ???:
    return my_obj.a is not None

我认为我可能有必要在类型提示中实现与方括号有关的功能,但我真的不知道从哪里开始。

TypeGuard 注释可用于注释 class 的子 class。如果为这些 classes 指定了参数类型,则 MyPy 将成功识别类型缩小操作。

class MyClass:
    a: Optional[int]
    b: Optional[str]
    # Some other things

# Two hidden classes for the different types
class _MyClassInt(MyClass):
    a: int
    b: None
class _MyClassStr(MyClass):
    a: None
    b: str


def someTypeGuard(my_obj: MyClass) -> TypeGuard[_MyClassInt]:
    """Check if my_obj's `a` property is NOT `None`"""
    return my_obj.a is not None

def someOtherTypeGuard(my_obj: MyClass) -> TypeGuard[_MyClassStr]:
    """Check if my_obj's `b` property is NOT `None`"""
    return my_obj.b is not None

遗憾的是,未能缩小到一种类型不会自动缩小到另一种类型,除了在您的 else 块中 assert someOtherTypeGuard(obj) 之外,我找不到一种简单的方法来做到这一点。

即便如此,这似乎也是最好的解决方案。