Yield in a recursive function

后端 未结 9 705
独厮守ぢ
独厮守ぢ 2021-01-30 10:49

I am trying to do something to all the files under a given path. I don\'t want to collect all the file names beforehand then do something with them, so I tried this:

<         


        
9条回答
  •  暗喜
    暗喜 (楼主)
    2021-01-30 11:08

    To answer the original question as asked, the key is that the yield statement needs to be propagated back out of the recursion (just like, say, return). Here is a working reimplementation of os.walk(). I'm using this in a pseudo-VFS implementation, where I additionally replace os.listdir() and similar calls.

    import os, os.path
    def walk (top, topdown=False):
        items = ([], [])
        for name in os.listdir(top):
            isdir = os.path.isdir(os.path.join(top, name))
            items[isdir].append(name)
        result = (top, items[True], items[False])
        if topdown:
            yield result
        for folder in items[True]:
            for item in walk(os.path.join(top, folder), topdown=topdown):
                yield item
        if not topdown:
            yield result
    

提交回复
热议问题