自定义模块级常量的Python类型提示

自定义模块级常量的Python类型提示,python,constants,alias,type-hinting,typing,Python,Constants,Alias,Type Hinting,Typing,我试图向我的类中添加类型提示,但在模块级常量方面,我遇到了这个特殊问题。在下面的例子中,我用BLUECAR、REDCAR、YELLOWCAR、WHITECAR替换了我的常量——简单地假设我的整个程序围绕这4个常量展开,这就是我明确定义这些常量的原因 从集合导入namedtuple 从键入导入列表、Union、TypeVar #我根据id和名称定义CarTypeRef CarTypeRef=namedtuple(“CarType”、“id name”) #我通过id和名称定义可能的汽车类型 BLU

我试图向我的类中添加类型提示,但在模块级常量方面,我遇到了这个特殊问题。在下面的例子中,我用BLUECAR、REDCAR、YELLOWCAR、WHITECAR替换了我的常量——简单地假设我的整个程序围绕这4个常量展开,这就是我明确定义这些常量的原因

从集合导入namedtuple
从键入导入列表、Union、TypeVar
#我根据id和名称定义CarTypeRef
CarTypeRef=namedtuple(“CarType”、“id name”)
#我通过id和名称定义可能的汽车类型
BLUECAR:CarTypeRef=CarTypeRef(1,‘蓝色汽车’)
REDCAR:CarTypeRef=CarTypeRef(2,‘红色汽车’)
YELLOWCAR:CarTypeRef=CarTypeRef(3,‘黄色汽车’)
WHITECAR:CarTypeRef=CarTypeRef(4,‘白色汽车’)
“”“id名称为的车辆类型初始化”“”
# 1. 尝试:这不起作用:
CarType=TypeVar(“CarType”、蓝车、红车、黄车、白车)
“”“可能的车辆类型的类型别名”“”
# 2. try:此(类型别名)也不起作用:
CarType=Union[蓝车、红车、黄车、白车]
#稍后我将使用以下列表
#例如,在可用的车辆类型中循环
目录类型:列表[目录类型]=[
蓝车,
红车,
YELLOWCAR,
[白色汽车]
“”“可用车辆类型”“”
对于这两种类型定义,我在运行时都会得到以下输出:

> 1.try: TypeError: Union[arg, ...]: each arg must be a type. Got CarType(id=1, name='Blue Car').
> 2. try: TypeError: TypeVar(name, constraint, ...): constraints must be types. Got CarType(id=1, name='Blue Car').
我做错了什么?如何为这4个常量创建自定义类型检查


注意:当然,我可以简单地使用字符串(例如:“bluecar”、“redcar”…),但由于这4个常量经常出现在我的代码中,所以我想更明确一点——既为了代码易读性,也为了静态类型测试。

感谢@Aran Fey为我指明了正确的方向。我还没听说过python中的枚举。我能够显著减少代码,现在只有:

类类型(枚举):
“”“可用车辆类型”“”
蓝车=1
红车=2
黄色汽车=3
白车=4
我甚至可以获得人类可读的文本,而无需指定
str
作为名称,例如:

>打印(Car.REDCAR.name.lower().capitalize())
红车
。。虽然它有点复杂

此外,我不能直接导入BLUECAR、REDCAR、YELLOWCAR或WHITECAR,这意味着我必须始终引用具有完整枚举类的对象,例如

from.typedef导入CarType
如果输入[CarType.BLUECAR、CarType.REDCAR、CarType.WHITECAR]:
漆成黄色(汽车)
。。这远不止是代码:

from.typedef导入BLUECAR、REDCAR、WHITECAR
如果输入[BLUECAR、REDCAR、WHITECAR]:
漆成黄色(汽车)
[更新]

虽然枚举方法很好,但我最终使用了简单的字符串常量,这更符合我的目的,例如:

蓝车:str=“蓝车” 红色汽车:str=“红色汽车” 黄色汽车:str=“黄色汽车” 白色汽车:str=“白色汽车” CARTYPES:List[str]=[BLUECAR、REDCAR、YELLOWCAR、WHITECAR] 。。因为我可以做到:

from.typedef导入BLUECAR、REDCAR、YELLOWCAR、WHITECAR、CARTYPES
对于car_类型的CARTYPES:
...
..
如果输入[BLUECAR,REDCAR]:
...

我知道这是特定于如何使用这些变量的,也许汽车类型示例并不适合描述我的实际实施场景。

感谢@Aran Fey为我指明了正确的方向。我还没听说过python中的枚举。我能够显著减少代码,现在只有:

类类型(枚举):
“”“可用车辆类型”“”
蓝车=1
红车=2
黄色汽车=3
白车=4
我甚至可以获得人类可读的文本,而无需指定
str
作为名称,例如:

>打印(Car.REDCAR.name.lower().capitalize())
红车
。。虽然它有点复杂

此外,我不能直接导入BLUECAR、REDCAR、YELLOWCAR或WHITECAR,这意味着我必须始终引用具有完整枚举类的对象,例如

from.typedef导入CarType
如果输入[CarType.BLUECAR、CarType.REDCAR、CarType.WHITECAR]:
漆成黄色(汽车)
。。这远不止是代码:

from.typedef导入BLUECAR、REDCAR、WHITECAR
如果输入[BLUECAR、REDCAR、WHITECAR]:
漆成黄色(汽车)
[更新]

虽然枚举方法很好,但我最终使用了简单的字符串常量,这更符合我的目的,例如:

蓝车:str=“蓝车” 红色汽车:str=“红色汽车” 黄色汽车:str=“黄色汽车” 白色汽车:str=“白色汽车” CARTYPES:List[str]=[BLUECAR、REDCAR、YELLOWCAR、WHITECAR] 。。因为我可以做到:

from.typedef导入BLUECAR、REDCAR、YELLOWCAR、WHITECAR、CARTYPES
对于car_类型的CARTYPES:
...
..
如果输入[BLUECAR,REDCAR]:
...

我知道这是特定于如何使用这些变量的,可能汽车类型示例并不适合描述我的实际实现场景。

BLUECAR
REDCAR
等都是值,而不是类型。请看一看,因为这正是您(很差)使用此代码实现的内容。
BLUECAR
REDCAR
等都是值,而不是类型。请看一看,因为这正是您(拙劣地)用这段代码实现的。