05/11/2010 09:07 PM, Terry Reedy wrote:
PS: I never understood why os.walk does not support hooks for key
events during such a tree traversal.

Either 1) it is intentionally simple, with the expectation that people
would write there own code for more complicated uses or 2) no one has
submitted a 'full-featured' version or 3) both.

If os.walk were rewritten, it should be as an iterator (generator).
Directory entry and exit functions could still be added as params.

It *is* an iterator/generator. However, I suspect you mean that it should slurp the dirs/files iteratively instead of using listdir() as was discussed on c.l.p a few months back.

The patch to os.py would be fairly simple, something like
--------------------------------------------
--- /usr/lib/python2.5/os.py
+++ ~/tmp/os.py
@@ -220,7 +220,7 @@

 __all__.extend(["makedirs", "removedirs", "renames"])

-def walk(top, topdown=True, onerror=None):
+def walk(top, topdown=True, onerror=None, pre=None, post=None):
     """Directory tree generator.

For each directory in the directory tree rooted at top (including top
@@ -296,15 +296,19 @@
         else:
             nondirs.append(name)

+    if pre is not None:
+        top, dirs, nondirs = pre(top, dirs, nondirs)
     if topdown:
         yield top, dirs, nondirs
     for name in dirs:
         path = join(top, name)
         if not islink(path):
-            for x in walk(path, topdown, onerror):
+ for x in walk(path, topdown, onerror, pre=pre, post=post):
                 yield x
     if not topdown:
         yield top, dirs, nondirs
+    if post is not None:
+        post(top, dirs, nondirs)

--------------------------------------------

which would allow you to do things like

  def pre(top, dirs, nondirs):
      dirs = [d for d in dirs
              if d not in ('RCS', '.svn', '.hg', '.git')]
      return top, dirs, nondirs
  def post(top, dirs, nondirs):
      complex_process(top)
  for top, dirs, nondirs in my.walk(PATH, pre=pre, post=post):
      do_stuff(...)

I suspect if I thought about it much longer, only one would really be needed, the other accommodated by the "topdown" parameter.

-tkc



--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to