繁体   English   中英

使用 union 键入别名

Type alias with union

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我目前有这种类型的别名,以及我的代码中的一些相关函数:

Constant = int

def operation(data: Union[Constant, OtherTypes]):
    if isinstance(data, Constant):
        # do something
    else:
        # do something else

现在,我想让Constant也代表另一种类型,比如浮点数。 这个常量别名在我的代码库中使用,所以我不想到处更改它。

我努力了:

Constant = (int, float)

这与isinstance配合得很好,但Union抱怨"TypeError: Union[arg, ...]: each arg must be a type."

然后我尝试过:

Constant = Union[int, float]

现在,问题来自isinstance 我得到"TypeError: Subscripted generics cannot be used with class and instance checks"

有没有办法做我想要实现的目标?

谢谢。

2 个回复

支持Union s 的isinstance附带 python 3.10。 因此,从该版本开始,第二个解决方案将起作用。

请参阅https://peps.python.org/pep-0604/

对于 3.10 之前的 Python,如 Frank、MSeifert 和 Richard Xia 的 Python 3.6 答案中的 Check a variable against Union type at runtime 中所述,您可以执行以下操作:

Python 3.8+

使用typing.get_args(tp) function 来获取具有联合类型的元组,您可以在isinstance内部使用:

from typing import Union, get_args

Constant = Union[int, float]

def operation(data: Union[Constant, OtherTypes]):
    if isinstance(data, get_args(Constant)):
        # do something
    else:
        # do something else

get_args仅返回类型的 arguments 而不验证该类型是Union还是其他泛型类型,这似乎足以满足您的要求。

如果由于某种原因您还需要在运行时检查Constant类型是否专门为Union ,请使用typing.get_origin(tp) function:

from typing import Union, get_origin

if get_origin(Constant) is Union:
    # do something

Python 3.5.3+

在 3.8 之前, get_argsget_origin函数不存在,因此您需要使用未记录的属性__args____origin__来代替。

def operation(data: Union[Constant, OtherTypes]):
    if isinstance(data, Constant.__args__):
        # do something
    else:
        # do something else

这仍然适用于 3.10.5,但由于这些属性未记录在案,因此在任何未来的 Python 版本中,上面的代码片段可能会立即停止工作。

Python 3.5.0 至 3.5.2

类型提示在 Python 的 3.5.0 版本中实现。 在 3.5.2 之前,获取联合的 arguments 的属性名称是__union_params__

def operation(data: Union[Constant, OtherTypes]):
    if isinstance(data, Constant.__union_params__):
        # do something
    else:
        # do something else

当然,这个属性只存在于Union类型中,所以如果需要检查一个类型是否为Union ,请检查该属性是否存在。

请注意,这仅适用于 Python 3.5.2,因为在 3.5.3 中他们将属性名称更改为__args__

1 细化以在联合中键入别名

我正在尝试检查联合类型的值是否是联合类型之一。 在下面的代码中,前三种方法 (1-3) 似乎不是正确的方法。 检查特定属性的方法 (4) 似乎有效,尽管尚不清楚它已改进为哪种类型。 它在(4)( A或B )中精炼成哪种类型? 为什么不能将数字或字符串分配给 (5) 和 (6) 中的a1.a ? 哪一 ...

2 键入别名作为区分联合

我编写了一个相当复杂的定义文件来匹配现有 JavaScript 库的行为 为简洁起见,某些联合类型作为属性已被缩短,但这里的要点是我有一个可区分的联合,另一种类型要从该联合中继承,而另一个可区分的联合则要从该类型继承。 当我在 function 中使用树底部的联合时,如下所示: 我收到一个错误,即P ...

3 可以是一个联合成员别名的联盟吗?

提出这个问题 : C11标准声明指向联合的指针可以转换为指向其每个成员的指针。 从第6.7.2.1.1节开始: 联合的大小足以包含其最大的成员。 最多一个成员的值可以随时存储在union对象中。 指向适当转换的union对象的指针指向其每个成员 (或者如果成员是位字段,则指 ...

6 将打字稿别名转换为具有联合类型的接口

如何将此type alias转换为接口? 我的直觉是要使用,但这是错误的。 我想做的是用接口替换类型。 因此,基本上只能为该接口类型的变量分配以下值之一:“ RED”,“ GREEN”或“ BLUE” ...

8 具有单值联合类型和别名的记录析构函数参数

我正在使用带有单个值的联合类型作为我的 ID 类型安全: 假设我有一个记录: 我知道我可以做一个记录破坏: 同样通过赋值: 如果我也需要访问记录: 并且还破坏单一类型: 也通过赋值: 有没有可能将这两者结合在一起? 我尝试了几种不同的方法都没有成功,例如: 我目前的解 ...

2017-01-08 01:52:48 1 490   elm
9 使用Either的别名在Scala中写入类似联合类型的Ceylon

随着Ceylon 1.0的发布,一些人正在讨论联合类型的有用性。 我想知道你如何简洁地编写以下代码: ......在斯卡拉? 我的想法是这样的: 但模式提取器无法编译。 有任何想法吗? 我知道类似的问题存在于一些有效的答案中,但我特别想知道是否可以使用Either和提 ...

10 Python 类型提示:函数返回类型,作为参数给出,但类型是通用别名,如 Union

我们可以轻松指定函数的返回类型,即使我们期望的类型是作为参数之一提供的: 但是如果我们提供 Union[str, int] 作为第一个参数,它就不起作用(不要看函数本身,我们可以用这个 Union 做一些更复杂的事情,即根据所提供的 Union 构建 pydantic 模型) 那么如何指定函 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM