【发布时间】:2020-03-19 07:35:00
【问题描述】:
我正在尝试向我的类添加类型提示,但我正在努力解决模块级常量的这个特殊问题。在下面的示例中,我用 BLUECAR、REDCAR、YELLOWCAR、WHITECAR 替换了我的常量 - 简单地假设我的整个程序围绕这 4 个常量发展,这就是我明确定义它们的原因。
from collections import namedtuple
from typing import List, Union, TypeVar
# I define CarTypeRef from id and name
CarTypeRef = namedtuple("CarType", "id name")
# I define possible car types by id and name
BLUECAR: CarTypeRef = CarTypeRef (1, 'Blue Car')
REDCAR: CarTypeRef = CarTypeRef (2, 'Red Car')
YELLOWCAR: CarTypeRef = CarTypeRef (3, 'Yellow Car')
WHITECAR: CarTypeRef = CarTypeRef (4, 'White Car')
"""Car type init with id-name"""
# 1. try: this does not work:
CarType = TypeVar("CarType", BLUECAR, REDCAR, YELLOWCAR, WHITECAR)
"""Type alias for possible car types"""
# 2. try: this (type alias) does also not work:
CarType = Union[BLUECAR, REDCAR, YELLOWCAR, WHITECAR]
# I later use the following list
# e.g. to loop through available car types
CARTYPES: List[CarType] = [
BLUECAR,
REDCAR,
YELLOWCAR,
WHITECAR]
"""Available car types"""
对于这两种类型定义,我在运行时都会得到以下输出:
> 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 个常量在我的代码中经常出现,所以我想更明确一点 -既是为了代码的易读性,也是为了静态类型测试。
【问题讨论】:
-
BLUECAR、REDCAR等是值,而不是类型。看看enum.Enum,因为这正是你(糟糕地)用这段代码重新实现的。
标签: python constants alias type-hinting typing