如何将常量对象用作字面量类型提示?
解决方案
有两种方法可以实现你的需求,既保证NO_RESULT是唯一对象,又能在类型提示中准确标注:
方法一:用Final标注常量配合Literal
这种方法直接基于你原有的实现,通过Final告诉类型检查器该常量的值不会被修改,从而让Literal[NO_RESULT]被识别为这个唯一对象的字面量类型:
from typing import Final, Literal, Hashable # 用Final标注,确保NO_RESULT是不可变的唯一实例 NO_RESULT: Final[object] = object() def foo() -> Hashable | Literal[NO_RESULT]: try: result: Hashable = res() return result except: return NO_RESULT
说明:主流类型检查器(如mypy >= 0.910、pyright)都支持这种写法,语义上完全匹配“唯一对象”的需求,不会出现类型实例的歧义。
方法二:使用单例枚举类
通过枚举类创建唯一的枚举成员,枚举成员本身就是单例,且Literal支持直接引用枚举成员作为字面量类型:
from enum import Enum from typing import Literal, Hashable # 定义私有枚举类,确保只有一个成员 class _NoResult(Enum): VALUE = object() # 对外暴露唯一实例 NO_RESULT = _NoResult.VALUE def foo() -> Hashable | Literal[_NoResult.VALUE]: try: result: Hashable = res() return result except: return NO_RESULT
说明:枚举的机制天然保证了NO_RESULT是唯一的,类型提示中的Literal[_NoResult.VALUE]能准确表示返回的是这个特定对象,完全符合你的语义要求。
内容的提问来源于stack exchange,提问作者Daraan
相关产品推荐
相关产品推荐

