from functools import partial
RECORD_SIZE = 32 with open('./data/files.data', 'rb') as f: records = iter(partial(f.read, RECORD_SIZE), b'') for r in records: print(r)
b'1 2 3 4 5 6 7 8 9 10 11 12 13 14' b' 15 16 17 18 19 20 21 22 23 24 2' b'5 26 27 28 29 30 31'
records 对象是一个可迭代对象,它会不断的产生固定大小的数据块,直到文件末尾。 要注意的是如果总记录大小不是块大小的整数倍的话,最后一个返回元素的字节数会比期望值少。
本例中目的是读取固定长度数据,并一行一行迭代读取。
functools.partial 用来创建一个每次被调用时从文件中读取固定数目字节的可调用对象。 标记值 b’’ 就是当到达文件结尾时的返回值。
def add(a, b)->int: return a + b add_100 = partial(add, a = 100) # 固定形参a add_100(b = 10) # -> 110
110
add的例子展示了partial可以固定函数add中的任意形参的值
class Add: def __init__(self, a, b): self.a = a self.b = b def get_values(self): return self.a + self.b class Sub: def __init__(self, a, b): self.a = a self.b = b def get_values(self): return self.a - self.b # 对拥有相同形参的对象进行统一实例化,即传入 def func(i, param=None)->int: """集中有序实例化对象""" default_param = { 'a' : 10, 'b' : 100 } if param: default_param.update(param) ops = [ partial( Add, **param ), partial( Sub, **param ) ] assert i < len(ops) return ops[i]() ## 测试函数 func d = {'a': 10, 'b':100} add_ab = func(0, d) add_ab.get_values()
110
type(add_ab)
__main__.Add
优势:直接将字典转化为对应的变量和值,key为变量名,value为变量取值