【发布时间】:2020-08-05 01:30:54
【问题描述】:
在 Python 中使用类型提示的一个缺点是牺牲了 Python 代码的美感。
在类型提示之前,我的方法签名很简洁:
def echo(items):
for i in items:
print(i)
由于我的团队正在使用类型提示,因此我也在我的代码中添加了类型提示:
def echo(items: Set[str]) -> None:
仍然很清晰。一段时间后,我的代码中在集合上运行的其他部分要求我的items 是可散列的,而其他部分则不需要。所以我决定也支持frozenset,现在我的方法看起来像:
def echo(items: Union[Set[str],Frozenset[str]]) -> None:
它开始看起来像 Java 中的方法,尽管在 Java 中我可以操作接口,忽略实现细节:
void echo(Set<String> items) {
Python 不支持接口概念,即我不能说Set 实现了Frozenset。由于鸭子类型,初始实现对Set 和Frozenset 都有效:两者的行为都与设置相同。但是,我的印象是,显式类型提示在某种程度上与鸭子类型不兼容
如何在打字提示和鸭式打字之间找到一个很好的平衡?
【问题讨论】:
-
我让其他人详细说明,但至少有
typing.AbstractSet可以解决接口问题。 -
这不是鸭子打字的真正问题,通过
Protocols 支持。这只是使用适当的共同祖先而不是枚举类的问题。
标签: python type-hinting