LaundroMat wrote: > Hi, > > I've found this script over at effbot > (http://effbot.org/librarybook/os-path.htm), and I can't get my head > around its inner workings. Here's the script: > > import os > > class DirectoryWalker: > # a forward iterator that traverses a directory tree > > def __init__(self, directory): > self.stack = [directory] > self.files = [] > self.index = 0 > > def __getitem__(self, index): > while 1: > try: > file = self.files[self.index] > self.index = self.index + 1 > except IndexError: > # pop next directory from stack > self.directory = self.stack.pop() > self.files = os.listdir(self.directory) > self.index = 0 > else: > # got a filename > fullname = os.path.join(self.directory, file) > if os.path.isdir(fullname) and not > os.path.islink(fullname): > self.stack.append(fullname) > return fullname > > for file in DirectoryWalker("."): > print file > > Now, if I look at this script step by step, I don't understand: > - what is being iterated over (what is being called by "file in > DirectoryWalker()"?); > - where it gets the "index" value from; > - where the "while 1:"-loop is quitted.
With dw = DirectoryWalker(".") the for loop is equivalent to index = 0 # internal variable, not visible from Python while True: try: file = dw[index] # invokes dw.__getitem__(index) except IndexError: break print file This is an old way of iterating over a sequence which is only used when the iterator-based approach dwi = iter(dw) # invokes dw.__iter__() while True: try: file = dwi.next() except StopIteration: break print file fails. Peter -- http://mail.python.org/mailman/listinfo/python-list