Python 允许递归 __iter__ 函数吗?

问题描述 投票:0回答:1

我正在尝试编写一个

__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个回答
6
投票

现在,当您递归调用

_iterate_on_dir
时,您只是在创建一个生成器对象,而不是实际上迭代它。

修复方法是

yield from
生成器而不是调用它:

if os.path.isdir(full_path):
    yield from self._iterate_on_dir(full_path)

请注意,Python 2 中不存在此语法,而是:

for thing in self._iterate_on_dir(full_path):
    yield thing
© www.soinside.com 2019 - 2024. All rights reserved.