2017-08-21 178 views
3

我想實現一個從RawIOBase繼承的類。我正努力實施讀取方法。基本上,我不知道如何改變作爲參數傳遞的bytearray對象的內容。如何實現readinto()方法

我試過以下(幼稚)做法:

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

但是這一點,因爲我懷疑,將新bytearray對象分配給本地變量b,並沒有改變原有bytearray的內容。

回答

2

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) 

看看CPython的執行BytesIO.readinto。基本上它從對象緩衝區到函數輸入緩衝區執行memcpy。

+1

也可能工作:https://docs.python.org/2/library/functions.html#bytearray,而不是打開一個文件對象。 – jmunsch

+0

謝謝沒有通知 – ShmulikA

+0

這不正確地將結果追加到bytearray的結尾嗎?這顯然不是空的,因爲他根據傳入字節陣列的長度確定要讀取多少數據。 – drglove

0

你想改變對象b。綜觀bytearray的文檔,這樣的事情應該工作:

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