code: def walk(self, path = None, topdown=True):
          
  
          if path is None:
              path = self.root
  
          root = self.find(path)
  
          if not root.isdir():
              raise ValueError("can only walk storage types")
  
          if not root.child_id:
              return
  
          if topdown:
              storage_items = []
              stream_items = []
  
              for item in self.listdir(root):
                  if item.isdir():
                      storage_items.append(item)
                  else:
                      stream_items.append(item)
  
              yield root, storage_items, stream_items
  
              for item in storage_items:
                  for root, storage_items, stream_items in self.walk(item):
                      yield root, storage_items, stream_items
          else:
  
              def topdown_visit_node(root):
                  storage_items = []
                  stream_items = []
                  for item in self.listdir(root):
                      if item.isdir():
                          for sub_root, sub_storage, sub_stream in topdown_visit_node(item):
                              yield sub_root, sub_storage, sub_stream
  
                          storage_items.append(item)
                      else:
                          stream_items.append(item)
  
                  yield root, storage_items, stream_items
  
              for root_item, storage, stream in topdown_visit_node(root):
                  yield root_item, storage, stream
docs: Similar to :func:`os.walk`, yeields a 3-tuple ``(root, storage_items, stream_items)``