如何在python中定义最终的classvar变量

How to define final classvar variable in python

提问人:sorosh_sabz 提问时间:2/20/2021 最后编辑:yivisorosh_sabz 更新时间:10/15/2021 访问量:7741

问:

正如您在 PEP 526 中看到的,我们可以使用 ClassVar 字定义静态变量类。如下图所示

class Starship:
    stats: ClassVar[dict[str, int]] = {} # class variable
    damage: int = 10                     # instance variable

另一个打字功能,正如您在 PEP 591 中看到的那样,我们可以用 Final word 定义常量(只读)变量,如下所示

class Connection:
    TIMEOUT: Final[int] = 10

我的问题是,如何结合这两个词来表示我的类静态变量是 Final?

例如,下面的代码是否有效?

class Connection:
    TIMEOUT: Final[ClassVar[int]] = 10
python-3.x python-3.8 python-typing

评论

3赞 Klaus D. 2/20/2021
只是为了说明这一点:类型注释不会将名称定义为类型,而是将其记录为类型。
0赞 sorosh_sabz 2/20/2021
这是什么意思?请多解释@KlausD。
1赞 juanpa.arrivillaga 2/20/2021
@sorosh_sabz,我相信,这些是类型注释,但在运行时,它们不会以任何方式强制执行(除非您编写强制执行它们的代码,或者使用执行这些注释的库)。例如,以下代码工作正常x: str = 42
0赞 Klaus D. 2/20/2021
类型强制是类型注释的声明非目标。

答:

13赞 juanpa.arrivillaga 2/20/2021 #1

来自 PEP-591

类型检查器应推断出在 类体作为类变量。变量不应是 使用 ClassVar 和 Final 进行批注。

所以你只能使用:

class Connection:
    TIMEOUT: Final[int] = 10

评论

0赞 pabouk - Ukraine stay strong 7/26/2023
在当前的 Python 版本中,甚至不允许将两个类型限定符组合在一起。如果不使用---禁用注释的评估,则会导致运行时错误 示例:---> ---或反转时: --- mypy 显示以下错误消息:from __future__ import annotationsclass MyClass: x: Final[ClassVar[int]] = 1TypeError: typing.ClassVar[int] is not valid as type argumentTypeError: typing.Final[int] is not valid as type argumenterror: Variable should not be annotated with both ClassVar and Final