首页 > 解决方案 > 如何检查类型提示是否与代码中的 Iterable 兼容?

问题描述

我想要一个函数isiterable(t: type) -> bool,如果我传递的类型是可迭代的,则返回 true,否则返回 false。

assert isiterable(int) == False
assert isiterable(str) == False
assert isiterable(Iterable[int]) == True

一段时间以来,我一直在使用类型提示来装饰函数。但是,我现在正在处理一些需要通过类型提示识别的代码。我对此知之甚少。我的目标是 python 3.7,如果这有所作为。因此,这可能有一个明显的答案。

我可以通过蛮力构造它 - 检查类型类的名称是否为_GenericAlias,然后检查它_name-Iterator但由于许多原因,这感觉不可靠或未来证明!

编辑:我的问题似乎没有写清楚。我认为我所追求的称为类型自省。我在下面得到了一个有效的答案,但几乎可以肯定至少不是pythonic。我正在尝试支持 3.7 和 3.8,如果它有任何区别 - 支持 3.6 会很好。

标签: python-3.xtype-hinting

解决方案


这是可行的——但感觉它取决于实现细节,而不是类型系统的公共 API。我暂时将此标记为答案,直到我或其他人发布更正确的内容:

from typing import Type
def is_iterable(t: Type) -> bool:
        if type(i_type).__name__ != '_GenericAlias':
            return False

        import collections
        if i_type.__origin__ != collections.abc.Iterable:
            return False

        return True

如果你还想知道里面有什么XIterable[X]你可以通过i_type.__args__[0].


推荐阅读