在严格类型检查模式下使用 Pylance (ms-python.vscode-pylance) VS Code 扩展时,我的自定义 Enum 值出现类型错误,如下代码:
def println_ctrl_sequence(message: str, ctrlSequence: Union[ANSICtrlSequence, str]):
"""
This function is use with terminals to print the message
with colors specified by a, ANSI control sequence that
can be either a str or a console.ANSICtrlSequence object.
"""
if type(ctrlSequence) == ANSICtrlSequence:
ctrlSequenceStr: str = ctrlSequence.value
else:
ctrlSequenceStr = ctrlSequence
print("%s%s%s" % (
ctrlSequenceStr,
message,
ANSICtrlSequence.RESET.value
))
在线检测到类型错误,ctrlSequenceStr: str = ctrlSequence.value
因为ctrlSequence.value
被检测为 type Any | Unknown
。所以我的目标是强烈键入value
我的扩展属性Enum
:
# python enum : https://docs.python.org/3/library/enum.html
from enum import Enum
class ANSICtrlSequence(Enum):
# basic control sequences
RESET = "\033[m"
# full control sequences
PASSED = "\033[1;4;38;5;76m"
FAILED = "\033[1;5;38;5;197m"
我已经尝试过例如在“Python 中基于字符串的枚举”问答中ANSICtrlSequence(str, Enum)
指定的操作,但没有成功。
我已经阅读了该课程enum.pyi
,并且可以理解为什么 value 的类型是这样的:
class Enum(metaclass=EnumMeta):
name: str
value: Any
...
我找不到在文档或StackOverflow上的任何地方将我的 value 属性键入为 str 的方法。那么有可能吗?有没有办法覆盖继承属性的类型?或者我是否需要使用例如可能是 StrEnum 的 IntEnum 的等价物来扩展 Enum 类?也许我需要编写自己的强类型 Enum 类?有什么我错过的吗?