如何从typing.TypeAlias迁移到type statements

问题描述 投票:0回答:1

我创建了一个类型别名,用于通过类型注释定义

dataclass
中的成员变量:

>>> from typing import TypeAlias
>>> Number: TypeAlias = int | float
>>> n, x = 1, 2.5
>>> isinstance(n, Number)
True
>>> isinstance(x, Number)
True

根据docs,此语法已被弃用:

自版本 3.12 起已弃用:

TypeAlias
已弃用,取而代之的是
type
语句,该语句创建
TypeAliasType
的实例并本机支持前向引用。请注意,虽然
TypeAlias
TypeAliasType
具有相似的用途并且具有相似的名称,但它们是不同的,并且后者不是前者的类型。目前尚未计划删除
TypeAlias
,但鼓励用户迁移到
type
语句。

我尝试使用新语法,但出现错误:

>>> type Number = int | float
>>> isinstance(n, Number)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union

我该怎么办?

python python-typing
1个回答
0
投票

如果您需要在新语法中使用

isinstance
,则需要通过
__value__
属性显式访问类型别名的值(并强制其求值):

isinstance(n, Number.__value__)

当然,只有当别名的值与

isinstance
兼容时,这才有效,这排除了
NewType
或泛型之类的东西,或者......您想要为其创建类型别名的大多数东西,但是
int | float
应该没问题。

© www.soinside.com 2019 - 2024. All rights reserved.