code: def walk(self, relpath, topdown=True):
      
      for root, dirs, files in self._walk_raw(relpath, topdown):
        matched_dirs = self.ignore.match_files([os.path.join(root, "{}/".format(d)) for d in dirs])
        matched_files = self.ignore.match_files([os.path.join(root, f) for f in files])
        for matched_dir in matched_dirs:
          dirs.remove(fast_relpath(matched_dir, root).rstrip('/'))
  
        for matched_file in matched_files:
          files.remove(fast_relpath(matched_file, root))
  
        yield root, dirs, files
docs: Walk the file tree rooted at `path`.
  
      Works like os.walk but returned root value is relative path.
      Ignored paths will not be returned.