【问题标题】:Does Python allow a recursive __iter__ function?Python 是否允许递归 __iter__ 函数?
【发布时间】:2015-07-03 20:26:32
【问题描述】:

我正在尝试编写一个__iter__ 函数,它应该递归地遍历一个目录(包括子目录),并且由于它的结构是任意的,我认为递归函数将是可行的方法。但它不起作用。

这是我所拥有的:

class Dummy(object):

    def __init__(self, directory):
        self.directory = directory

    def _iterate_on_dir(self, path):
        '''
        Internal helper recursive function.
        '''
        for filename in os.listdir(path):
            full_path = os.path.join(path, filename)
            if os.path.isdir(full_path):
                self._iterate_on_dir(full_path)
            else:
                yield full_path

    def __iter__(self):
        '''
        Yield filenames
        '''
        return self._iterate_on_dir(self.directory)

一些print 语句告诉我递归调用被简单地忽略了。

我怎样才能做到这一点?

【问题讨论】:

  • 请举例说明输入和输出以及你如何称呼你的班级。

标签: python recursion iterator generator


【解决方案1】:

现在,当您递归调用 _iterate_on_dir 时,您只是在创建一个生成器对象,而不是真正迭代它。

修复:self._iterate_on_dir(full_path) 应该变成:

for thing in self._iterate_on_dir(full_path):
    yield thing

如果您使用的是 Python 3,则可以将其替换为:

yield from self._iterate_on_dir(full_path)

【讨论】:

  • 您已经正确地诊断出递归问题,但__iter__ 实际上就是这样。返回一个生成器是实现__iter__ 的一种完全有效的方法,因为生成器是一个迭代器。
  • @Blckknght 哦,当然。我总是忘记迭代器协议有很多选择。已修复,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多