gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:05:10 25 4
gpt4 key购买 nike

我正在尝试向我的类添加类型提示,但我正在努力解决模块级常量的这个特定问题。在下面的示例中,我用 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 个常量在我的代码中经常出现,所以我想更明确一点 -既为了代码的易读性,也为了静态类型测试。

最佳答案

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

class CarType(Enum):
"""Available car types"""
BLUECAR = 1
REDCAR = 2
YELLOWCAR = 3
WHITECAR = 4

我什至可以获得人类可读的文本,而无需指定 str 作为名称,例如:

>>>> print(Car.REDCAR.name.lower().capitalize())
Redcar

..虽然有点复杂。

此外,我无法直接导入 BLUECAR、REDCAR、YELLOWCAR 或 WHITECAR,这意味着我始终必须引用那些具有完整枚举类的内容,例如

from .typedef import CarType
if car_type in [CarType.BLUECAR, CarType.REDCAR, CarType.WHITECAR]:
paint_yellow(car)

.. 代码远多于:

from .typedef import BLUECAR, REDCAR, WHITECAR

if car_type in [BLUECAR, REDCAR, WHITECAR]:
paint_yellow(car)

[更新]

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

BLUECAR: str = "Blue Car"
REDCAR: str = "Red Car"
YELLOWCAR: str = "Yellow Car"
WHITECAR: str = "White Car"

CARTYPES: List[str] = [BLUECAR, REDCAR, YELLOWCAR, WHITECAR]

..因为我可以做到:

from .typedef import BLUECAR, REDCAR, YELLOWCAR, WHITECAR, CARTYPES

for car_type in CARTYPES:
...
..
if car_type in [BLUECAR, REDCAR]:
...

我知道这特定于这些变量的使用方式,也许汽车类型示例并不适合描述我的真实实现场景。

关于自定义模块级常量的 Python 类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59007626/

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