gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:35:28 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

TypeGuard 注释可用于注释类的子类。如果为这些类指定了参数类型,则 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) 之外,我找不到一种简单的方法来做到这一点 block 。

即使这似乎仍然是最好的解决方案。

关于python - 如何在 Python 中对对象的属性执行类型保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71029876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com