这似乎不起作用:
from typing import NewType
MyStr = NewType("MyStr", str)
x = MyStr("Hello World")
isinstance(x, MyStr)
我什至没有得到
False
,但是
TypeError: isinstance() arg 2 must be a type or tuple of types
因为
MyStr
是一个函数并且
isinstance
需要一个或多个
type
甚至|| |或
assert type(x) == MyStr
失败。
is MyStr
我做错了什么?
What am I doing wrong?
误解了 Python 类型提示中
NewType
的用途。
NewType
不会创建新的类型,而只是在类型检查时起作用。在运行时,
NewType
创建的类型与其原始类型相同。
这就是为什么
isinstance(x, MyStr)
和
type(x) == MyStr
不起作用的原因。在运行时,
x
只是一个
str
,而不是
MyStr
。
NewType
的用途:
NewType
的主要目的是提供类型提示,以帮助类型检查器(如 MyPy)在编译时捕获错误。它允许创建现有类型的别名,并将其视为不同的类型,以便类型检查器可以区分它们。
示例:
from typing import NewType
UserId = NewType("UserId", int)
ItemId = NewType("ItemId", int)
def get_item_by_user(user_id: UserId) -> ItemId:
# ... some logic to get item id based on user id
return ItemId(123)
# This will raise a type error with MyPy,
# because we are passing a UserId to a function that expects an ItemId
get_item_by_user(ItemId(456))
在这个例子中,
UserId
和
ItemId
都是
int
的别名。类型检查器会将它们视为不同的类型,因此会捕获到代码中的类型错误。
结论:
NewType
不会在运行时创建新的类型。它仅用于类型提示和静态分析。如果需要在运行时创建新类型,则应使用类继承。