如何实现readinto()方法

时间:2017-08-21 20:32:12

标签: python python-bytearray

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

我尝试过(天真)方法:

def readinto(self, b):
    data = self.read(len(b))
    b = data
    return len(data)

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

2 个答案:

答案 0 :(得分:4)

来自RawIOBase.readinto的文档:

  

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

它有点令人困惑,但您需要写入bytes-like对象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)

看一下BytesIO.readinto的CPython实现。 它基本上是从对象的缓冲区到函数输入缓冲区的memcpy。

答案 1 :(得分:0)

您想要改变对象b。看一下bytearray的文档,这样的事情应该有效:

def readinto(self, b):
    toRead = len(b)
    data = self.read(toRead)
    toWrite = len(data)
    b[:toWrite] = data
    return toWrite