在 python3.9 类型模块中,NewType 函数允许使用新数据类型创建派生

In python3.9 type module NewType function allows creating derived with new data type

使用 python 的输入模块,我正在使用 NewType 来创建不同的类型。

UserId = NewType('UserId',int)

根据文档 https://docs.python.org/3/library/typing.html 如果我对任何操作使用新数据类型 UserId,输出将是原始类型,即 int。但是这样做:

total = UserId(0.3) + UserId(100)

type(total) # the output is float. Why is this changing to float should it be int?

甚至它允许将任何其他数据类型传递给 UserId。

some_id = UserId('adfd')

限制为原始类型没有错误。即整数

进一步 some_id 数据类型设置为 str.

我试图依靠它进行类型检查并在数据类型与原始数据类型不匹配时出错。迷茫所以想征求意见,是不是哪里有问题?

根据 documentation on NewType:

Note that these checks are enforced only by the static type checker. At runtime, the statement Derived = NewType('Derived', Base) will make Derived a function that immediately returns whatever parameter you pass it. That means the expression Derived(some_value) does not create a new class or introduce any overhead beyond that of a regular function call.

所以在 运行 时间任何 NewType 函数本质上只是 lambda x: x;它不会执行任何 isinstance 检查。使用 NewType 的目的纯粹是为了类型注释。如果您通过 mypy 等类型检查器将您的代码放入 IDE 或 运行 中,如果您在无效类型上使用它,则会显示警告。

如果您需要 运行时间类型检查,您可以使用如下简单的函数来实现:

def UserId(x):
    if isinstance(x, int):
        return x
    raise TypeError(f"{x} is not an int")

此外,如果您需要对更复杂的结构进行类型检查和验证,请查看 pydantic