如何实现readinto()方法

Luk*_*uke 5 python python-bytearray

我想实现一个从RawIOBase继承的类。我正在努力实现readinto方法。基本上,我不知道如何更改作为参数传递的bytearray对象的内容。

我已经尝试过以下(幼稚的)方法:

def readinto(self, b):
    data = self.read(len(b))
    b = data
    return len(data)
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这会将新bytearray对象分配给局部变量b,并且不会更改原始对象的内容bytearray

Shm*_*ikA 6

来自以下文档RawIOBase.readinto

将字节读入预先分配的、可写的类字节对象 b,并返回读取的字节数。如果对象处于非阻塞模式并且没有可用字节,则返回 None 。

它有点令人困惑,但您需要写入类似字节的对象b(未读取)

示例用法

import io

class MyIO(io.RawIOBase):
    def readinto(self, b):
        msg = b'hello'
        b[:len(msg)] = msg
        return len(msg)

i = MyIO()
buf = bytearray()
i.readinto(buf)
print(buf)
Run Code Online (Sandbox Code Playgroud)

看看BytesIO.readinto. 基本上它从对象的缓冲区到函数输入缓冲区执行 memcpy。