`glob.glob()` currently calls itself recursively to build a list of matches of
the dirname part of the pattern and then filters by the basename part. This is
effectively BFS. ``glob.glob('*/*/*/*/*/foo')`` will build a huge list of all
directories 5 levels deep even if only a handful of them contain a ``foo``
entry. A generator-based recusion would never have to store these list at once
by implementing DFS. This patch converts the `glob` function to an `iglob`
recursive generator . `glob()` now just returns ``list(iglob(pattern))``.

I also cleaned up the code a bit (reduced duplicate `has_magic()` checks and
created a second `glob0` helper func so that the main loop need not be
duplicated).

Thanks to Cherniavsky Beni for the patch!
This commit is contained in:
Johannes Gijsbers 2005-01-08 13:13:19 +00:00
parent e4172eadf3
commit 836f5433f7
3 changed files with 50 additions and 24 deletions

View file

@ -61,7 +61,9 @@ class GlobTests(unittest.TestCase):
else:
pattern = os.path.join(*parts)
p = os.path.join(self.tempdir, pattern)
return glob.glob(p)
res = glob.glob(p)
self.assertEqual(list(glob.iglob(p)), res)
return res
def assertSequencesEqual_noorder(self, l1, l2):
self.assertEqual(set(l1), set(l2))