Skip to content

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 字节(尤其最后一读),循环读到空串为止——流式处理的正确写法。

相关文档 ​

基于 VitePress 构建 · 教学用途