如何注释由多种鸭子类型组合而成的类型?

How to annotate a type that is a combination of multiple duck-types?

提问人:theberzi 提问时间:8/28/2022 更新时间:8/28/2022 访问量:122

问:

假设我想将参数注释到一个函数,它应该同时满足 和 (任何其他 2+ 类型都可以适用,我只是为了示例而选择了这两个)。我将如何注释它?typing.Sizedtyping.Hashable

鉴于可以使用 将类型组合为“or”,我希望像 or 这样的东西起作用,但不幸的是它没有(在 Python 3.10 上撰写本文时)。Sized | HashableSized & HashableSized + Hashable

这是否完全受支持,如果支持,则使用什么语法?

注解 python-typing typing duck-typing

评论

0赞 xihtyM 8/28/2022
如果你想添加多个不同的类型,你能不能只使用库中的类,像这样用逗号分隔。Uniontypingval: Union[...]
0赞 chepner 8/28/2022
@xihtyM表示可以 或 的类型,但不一定两者兼而有之。UnionSizedHashable
0赞 chepner 8/28/2022
@xihtyM 这不是 的有效用法。list
0赞 xihtyM 8/28/2022
没错,我看了一下你的答案,这似乎是两种类型的最佳方法。
0赞 theberzi 8/29/2022
联合等同于 .Type1 | Type2

答:

2赞 chepner 8/28/2022 #1

Sized & Hashable是一个合理的猜测,但不幸的是不支持交叉点类型。

您必须定义自己的子类,该子类继承自两者:

class SizedHashable(Sized, Hashable):
    pass

似乎正在做出一些努力来支持交叉点类型,但除了这个简短的提及之外,我找不到任何更新。