genchunks() 鸭子类型分派
🦆 把「序列」和「文件对象」统一成同一套分块逻辑的分派器。
📎 源码在线查看:
myhexdump.py#L193-L209(genchunks)
签名
python
def genchunks(mixed, size)
# 返回 chunks() 或 chunkread() 的生成器实现
python
def genchunks(mixed, size):
if hasattr(mixed, 'read'):
return chunkread(mixed, size)
else:
return chunks(mixed, size)鸭子类型
「有 .read 方法的就是文件,否则当序列」。不查类型,只看能力(hasattr)——这是 Python 鸭子类型的典型用法。
为什么这么设计
上层的 dumpgen 不用关心数据来自内存 bytes 还是打开的文件句柄,统一调 genchunks 即可:
python
def dumpgen(binary, size, sep):
for chunk in genchunks(binary, 16): # 不论 binary 是 bytes 还是 file
... # 统一格式化chunks vs chunkread
| 函数 | 输入 | 方式 | 适用 |
|---|---|---|---|
chunks(seq, size) | 内存序列 | 切片 seq[a:b] | 已在内存的数据 |
chunkread(f, size) | 文件对象 | f.read(size) 流式 | 大文件不一次性读入 |
chunkread 每次 read(size) 可能返回不足 size 字节(尤其最后一读),循环读到空串为止——流式处理的正确写法。