import io class MyIO(io.RawIOBase): 'Print size when invoke .read(size) function' def __init__(self, buffer): self.buffer = buffer self.posi = 0 def readable(self): return True def read(self, size=-1): print(' MyIO.read(size), size:', size) if size < 0: return self.buffer end_size = min(self.posi+size, len(self.buffer)) ret = self.buffer[self.posi:end_size] self.posi = end_size return ret def readinto(self, b): with memoryview(b) as view: data = self.read(len(view)) view[:len(data)] = data return len(data) b= b'a' * 100_000 print('br.read(50):') br = io.BufferedReader(MyIO(b), buffer_size=32*1024) dat = br.read(50) print('br.read(-1):') br = io.BufferedReader(MyIO(b), buffer_size=32*1024) dat = br.read(-1)