""" 容器类,用于储存文件、文件夹,支持 list 的操作,同时支持许多方法方便操作元素 元素类型为 namedtuple,至少拥有 name id 两个属性才能放入容器 """ __all__ = ['FileList', 'FolderList'] class ItemList: """具有 name, id 属性对象的列表""" def __init__(self): self._items = [] def __len__(self): return len(self._items) def __getitem__(self, index): return self._items[index] def __iter__(self): return iter(self._items) def __repr__(self): return f"" def __lt__(self, other): """用于路径 List 之间排序""" return '/'.join(i.name for i in self) < '/'.join(i.name for i in other) @property def name_id(self): """所有 item 的 name-id 列表,兼容旧版""" return {it.name: it.id for it in self} @property def all_name(self): """所有 item 的 name 列表""" return [it.name for it in self] def append(self, item): """在末尾插入元素""" self._items.append(item) def index(self, item): """获取索引""" return self._items.index(item) def insert(self, pos, item): """指定位置插入元素""" self._items.insert(pos, item) def clear(self): """清空元素""" self._items.clear() def filter(self, condition) -> list: """筛选出满足条件的 item condition(item) -> True """ return [it for it in self if condition(it)] def find_by_name(self, name: str): """使用文件名搜索(仅返回首个匹配项)""" for item in self: if name == item.name: return item return None def find_by_id(self, fid: int): """使用 id 搜索(精确)""" for item in self: if fid == item.id: return item return None def pop_by_id(self, fid): for item in self: if item.id == fid: self._items.remove(item) return item return None def update_by_id(self, fid, **kwargs): """通过 id 搜索元素并更新""" item = self.find_by_id(fid) pos = self.index(item) data = item._asdict() data.update(kwargs) self._items[pos] = item.__class__(**data) class FileList(ItemList): """文件列表类""" pass class FolderList(ItemList): """文件夹列表类""" pass