【问题标题】:In python3.9 type module NewType function allows creating derived with new data type在 python3.9 类型模块中,NewType 函数允许使用新数据类型创建派生
【发布时间】:2021-08-11 20:13:33
【问题描述】:

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

UserId = NewType('UserId',int)

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

总计 = UserId(0.3) + UserId(100)

type(total) # 输出为浮点数。为什么要改成浮点数,应该是int?

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

some_id = UserId('adfd')

没有错误限制为原始类型。即诠释。

另外 some_id 数据类型设置为 str。

如果数据类型与原始数据类型不匹配,我试图依靠它进行类型检查和错误输出。困惑所以想征求意见,这里有什么问题吗?

【问题讨论】:

  • 根据文档,“Python 运行时不强制执行函数和变量类型注释”。它只是一个类型hint
  • 谢谢。这也很有帮助

标签: python typing newtype


【解决方案1】:

根据documentation on NewType

请注意,这些检查仅由静态类型检查器强制执行。在运行时,Derived = NewType('Derived', Base) 语句将使Derived 成为一个函数,该函数会立即返回您传递给它的任何参数。这意味着表达式 Derived(some_value) 不会创建新类或引入任何超出常规函数调用的开销。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多