栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

“可迭代”在Python中到底是什么意思?为什么我的实现__getitem __()的对象不是可迭代的?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

“可迭代”在Python中到底是什么意思?为什么我的实现__getitem __()的对象不是可迭代的?

我认为此处的困惑点在于,尽管实现

__getitem__
确实 允许您迭代对象,但它
不是定义的接口的一部分
Iterable

该抽象基类允许虚拟的子类,其中实现了指定的方法(在的情况下,类的形式

Iterable
,只
__iter__
),被认为是由
isinstance
issubclass
是的ABC的子类
,即使他们没有明确地从他们继承 。但是,它不会检查方法实现是否 真正有效 ,而只是检查是否提供了方法实现。

有关更多信息,请参阅介绍ABC的PEP-3119。


使用

isinstance(e, collections.Iterable)
是检查对象是否可迭代的最pythonic方法

我不同意; 我会用鸭式打字,只是
尝试遍历该对象
。如果对象不是可迭代的,

TypeError
则将引发,如果您要处理不可迭代的输入,则可以捕获函数;如果不可以,则允许渗透到调用者。这完全避开了对象决定执行迭代的方式,只是找出它是否在最合适的时间执行。


要补充一点,我认为您引用的文档 有些
误导。引用

iter
docs,也许可以解决这个问题:

object
必须是支持迭代协议(该

__iter__()
方法)的集合对象,或者它必须支持序列协议(以
__getitem__()
开头的整数参数的方法
0
)。

这清楚地表明,尽管两种协议都使对象可迭代,但是只有一个是实际的 “迭代协议” ,并且正是要

isinstance(thing,Iterable)
测试的对象。因此,我们可以得出结论,在最一般的情况下,一种检查 “可以迭代的事物” 的方法是:

isinstance(thing, (Iterable, Sequence))

尽管这还需要你来实现

__len__
沿
__getitem__
“虚拟子类”
Sequence



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号