首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么重写__iter__会抛出RecursionError?

为什么重写__iter__会抛出RecursionError?
EN

Stack Overflow用户
提问于 2020-08-12 16:48:49
回答 1查看 149关注 0票数 3

我想重写在外部库中定义的ExternalIterExternalIter方法,因此我不能更改ExternalIter类的源代码。我在MyIter2MyIter3中实现了两种不同的重写方法。

代码语言:javascript
复制
class ExternalIter:
    
    def __init__(self):
        self.x = iter([
            (1, 2),
            (3, 4),
            (5, 6),
            (7, 8),
            (9, 10)
        ])
        
    def __iter__(self):
        return self
        
    def __next__(self):
        return next(self.x)
    
class MyIter2(ExternalIter):
    
    def __iter__(self):
        while True:
            try:
                i, j = super().__next__()
                yield i
                yield j
            except StopIteration:
                break
    
class MyIter3(ExternalIter):
    
    def __iter__(self):
        for i, j in super().__iter__():
            yield i
            yield j

ExternalIter的原始行为如下:

代码语言:javascript
复制
for i in ExternalIter():
    print(i)
# (1, 2)
# (3, 4)
# (5, 6)
# (7, 8)
# (9, 10)

我希望覆盖__iter__的行为,如下面的示例所示:

代码语言:javascript
复制
for i in MyIter2():
    print(i)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10

MyIter2作为例外。但是,像我在MyIter3中所做的那样,另一种重写方法会抛出RecursionError

代码语言:javascript
复制
for i in MyIter3():
    print(i)
---------------------------------------------------------------------------
RecursionError                            Traceback (most recent call last)
<ipython-input-8-4e1114201cac> in <module>
----> 1 for i in MyIter3():
      2     print(i)

<ipython-input-5-82da3324a8a3> in __iter__(self)
     30 
     31     def __iter__(self):
---> 32         for i, j in super().__iter__():
     33             yield i
     34             yield j

... last 1 frames repeated, from the frame below ...

<ipython-input-5-82da3324a8a3> in __iter__(self)
     30 
     31     def __iter__(self):
---> 32         for i, j in super().__iter__():
     33             yield i
     34             yield j

RecursionError: maximum recursion depth exceeded while calling a Python object

您能解释为什么第一种方法有效时,第二种实现会抛出错误吗?如何在不获取__iter__的情况下使用super().__iter__()覆盖RecursionError

您能否解释__iter__如何在继承的上下文中工作,以理解为什么super().__iter__()引用的是self,而不是父?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-12 17:11:22

super().__iter__()for循环进行自己的隐式iter(self)调用之前返回self,该调用启动无限递归。

由于for循环的工作方式,我在这里没有看到任何使用方法。您可以使用显式while循环来避免对__iter__的调用。

代码语言:javascript
复制
def __iter__(self):

    while True:
        try:
            i, j = next(self)
        except StopIteration:
            break
        yield i
        yield j

这并不是将self视为一个可迭代的,而是一个迭代器。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63381216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档