如何对 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)
之外,我找不到一种简单的方法来做到这一点。
即便如此,这似乎也是最好的解决方案。
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)
之外,我找不到一种简单的方法来做到这一点。
即便如此,这似乎也是最好的解决方案。