为什么regex match对象即使实现了\uugetitem,也不可编辑?

2024-05-13 14:49:30 发布

您现在位置:Python中文网/ 问答频道 /正文

正如您所知,implementing a ^{} method makes a class iterable

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呢?在


Tags: 方法falseindexdemodefiterablemethodclass
1条回答
网友
1楼 · 发布于 2024-05-13 14:49:30

有谎言,该死的谎言,还有Python文档。在

对于在C中实现的类,拥有__getitem__是不够的。这是因为在PyTypeObject中有两个2的地方,__getitem__可以映射到:^{}和{a2}。两者都有一个__getitem__[1][2])的插槽。在

查看^{}的源,tp_as_sequence被初始化为NULL,而{}被定义。在

如果使用一个参数调用iter()内置函数,将调用^{},该函数包含以下代码:

f = t->tp_iter;
if (f == NULL) {
    if (PySequence_Check(o))
        return PySeqIter_New(o);
    return type_error("'%.200s' object is not iterable", o);
}

它首先检查tp_iter槽(显然是NULL来查找_SRE_Match对象);如果失败了,那么如果PySequence_Check返回true,则生成一个新的序列迭代器,否则将引发TypeError。在

^{}首先检查对象是dict还是dict子类,在这种情况下返回false。否则,它将返回

^{pr2}$

由于s->ob_type->tp_as_sequence_SRE_Match实例的NULL,因此返回0,PyObject_GetIter引发{}。在

相关问题 更多 >