python-3.x - 如何检查类型提示是否与代码中的 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 会很好。
解决方案
这是可行的——但感觉它取决于实现细节,而不是类型系统的公共 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
如果你还想知道里面有什么X
,Iterable[X]
你可以通过i_type.__args__[0]
.
推荐阅读
- sharepoint - 表单字段修改日期
- ios - 在异步后台线程上运行 CADisplayLink 的正确方法?
- mysql - MySQL 查询以获取每月的项目计数 - 显示在每个项目的行中
- java - AddressSanitizer:运行包含调用 JNI_CreateJavaVM 的 C++ 代码时的 SEGV
- hdfs - 为什么 HDFS 不能在其管道恢复过程中使用剩余的良好数据节点?
- javascript - 如何将一个对等 js 连接到另一个?
- json - JQ - 仅顶级键和值的非递归合并
- c# - 创建新的 Azure 资源组项目时出错
- javascript - Discord.js !kick 命令说访问被拒绝,尽管我有这个角色
- reactjs - 使用未定义的属性“参数”反应 js 错误