增加 Python 新整数类型的惯用方法是什么?

eep*_*epp 5 python python-3.x type-annotation python-typing

假设我定义了一个新类型:

import typing

Index = typing.NewType('Index', int)
Run Code Online (Sandbox Code Playgroud)

然后假设我有一个Index变量:

index = Index(0)
Run Code Online (Sandbox Code Playgroud)

增量的惯用方法是index什么?

如果我做

index += 1
Run Code Online (Sandbox Code Playgroud)

这相当于

index = index + 1
Run Code Online (Sandbox Code Playgroud)

那么类型index变为int而不是Index从静态类型检查的角度来看:

$ mypy example.py
Run Code Online (Sandbox Code Playgroud)
example.py:4: error: Incompatible types in assignment (expression has type "int", variable has type "Index")
Run Code Online (Sandbox Code Playgroud)

有什么比

index = Index(index + 1)
Run Code Online (Sandbox Code Playgroud)

保持Index类型?

ale*_*ame 1

我认为您将无法隐式(间接)保留变量操作结果的类型NewType,因为正如文档所述:

您仍然可以对 类型的变量执行所有 int 运算UserId,但结果将始终是类型int

因此,对变量的任何操作都会产生基本类型的结果。如果您希望结果为 a NewType,则需要明确指定它,例如 as index = Index(index + 1)。这里Index用作强制转换函数。

这与以下目的是一致的NewType

静态类型检查器会将新类型视为原始类型的子类。这对于帮助捕获逻辑错误很有用

NewType 的预期目的是帮助您检测意外地将旧基本类型和新派生类型混合在一起的情况。