Lv100版本源码上传
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
"""
|
||||
容器类,用于储存文件、文件夹,支持 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"<List {', '.join(it.__str__() for it in self)}>"
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user