如果我解析Python文件的ast并看到一个变量有一个类型注释,例如Mapping
,我如何判断该注释是否支持__iter__
一种选择是查看https://mypy.readthedocs.io/en/stable/protocols.html,列出所有支持__iter__
的内容(例如Iterable
、Iterator
、Collection
,…),并检查给定变量的注释是否在该列表中
但是,这感觉很脆弱——有更好的方法吗?我只需要从变量的ast解析变量的注释就可以做到这一点——在变量上运行iter
不是一个选项
最简单的方法是解析给定注释的FQN,然后检索它所属模块的存根(例如,从typeshed中
typing.pyi
),然后递归地取消类实现的所有方法,并检查它是否实现了您希望它执行的协议。显然,这是一个复杂的过程,因此,如果您想让东西变得更简单,而不是解析和部分计算模块存根,您可以尝试动态导入到模块,然后执行简单的issubclass
检查相关问题 更多 >
编程相关推荐