正如您所知,implementing a ^{
class IterableDemo:
def __getitem__(self, index):
if index > 3:
raise IndexError
return index
demo = IterableDemo()
print(demo[2]) # 2
print(list(demo)) # [0, 1, 2, 3]
print(hasattr(demo, '__iter__')) # False
但是,对于正则表达式匹配对象,这并不成立:
^{pr2}$值得注意的是,此异常不会在__iter__
方法中引发,因为该方法甚至没有实现:
>>> hasattr(match, '__iter__')
False
那么,如何可能实现__getitem__
而不使类成为iterable呢?在
有谎言,该死的谎言,还有Python文档。在
对于在C中实现的类,拥有} 和{a2}。两者都有一个
__getitem__
是不够的。这是因为在PyTypeObject
中有两个2的地方,__getitem__
可以映射到:^{__getitem__
([1],[2])的插槽。在查看^{} 的源,}被定义。在
tp_as_sequence
被初始化为NULL
,而{如果使用一个参数调用} ,该函数包含以下代码:
iter()
内置函数,将调用^{它首先检查
tp_iter
槽(显然是NULL
来查找_SRE_Match
对象);如果失败了,那么如果PySequence_Check
返回true,则生成一个新的序列迭代器,否则将引发TypeError
。在^{} 首先检查对象是
^{pr2}$dict
还是dict
子类,在这种情况下返回false。否则,它将返回由于}。在
s->ob_type->tp_as_sequence
是_SRE_Match
实例的NULL
,因此返回0,PyObject_GetIter
引发{相关问题 更多 >
编程相关推荐