DEV Community

loading...

Python メモリビュー型 memoryview

maru3kaku4kaku profile image maru3kaku4kaku Originally published at marusankakusikaku.jp ・1 min read

bytesやbytearrayなど
バッファプロトコル をサポートするオブジェクトの内部データに直接アクセスするのに使用できるクラスです。

memoryviewの定義

memoryview(対象のオブジェクト)でmemoryviewを作成できる。

b = b"abcdefghijk"
mv = memoryview(b)
mv[3] # => 100
bytes(mv[3:6]) # => b'def'
Enter fullscreen mode Exit fullscreen mode
b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv[3] # => 100
bytes(mv[3:6]) # => b'def'
Enter fullscreen mode Exit fullscreen mode

memoryviewの書き換え

参照しているオブジェクトが書き換え可能な場合、同じサイズの代入ができる。

b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.readonly # => False
mv[3] = 88
mv[4:6] = b"YZ"
mv.tobytes() # => b'abcXYZghijk
Enter fullscreen mode Exit fullscreen mode

イミュータブルなオブジェクトを参照している場合は書き換えできない。

b = b"abcdefghijk"
mv = memoryview(b)
mv.readonly # => True
mv[3] = 88 # => TypeError: cannot modify read-only memory
Enter fullscreen mode Exit fullscreen mode

memoryviewのメソッド

tobytes(order=None) バイト文字列

b = b"abcdefghijk"
mv = memoryview(b)
mv.tobytes() # => b'abcdefghijk'
Enter fullscreen mode Exit fullscreen mode

hex([sep[, bytes_per_sep]]) 16進数文字列

b = b"abcdefghijk"
mv = memoryview(b)
mv.hex() # => '6162636465666768696a6b'
mv.hex("-") # => '61-62-63-64-65-66-67-68-69-6a-6b'
mv.hex("-", 4) # => '616263-64656667-68696a6b'
Enter fullscreen mode Exit fullscreen mode

tolist() 要素のリスト

b = b"abcdefghijk"
mv = memoryview(b)
mv.tolist() # => [97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107]
Enter fullscreen mode Exit fullscreen mode

toreadonly() 読み取り専用のメモリービュー

b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.readonly # => False
mv[3] = 88
mv[4:6] = b"YZ"
mv.tobytes() # => b'abcXYZghijk

mv_readonly = mv.toreadonly()
mv_readonly[3] = 88 # => TypeError: cannot modify read-only memory
Enter fullscreen mode Exit fullscreen mode

release() 開放

b = b"abcdefghijk"
mv = memoryview(b)
mv.release()
Enter fullscreen mode Exit fullscreen mode

withで開放を忘れずに行える。

with memoryview(b) as mv:
    print(mv[1])
Enter fullscreen mode Exit fullscreen mode

obj memoryview が参照しているオブジェクト

b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.obj == b"abcdefghijk" # => True
Enter fullscreen mode Exit fullscreen mode

readonly 読み取り専用プリパティ

b = bytearray(b"abcdefghijk")
mv = memoryview(b)
mv.readonly # => False

b = b"abcdefghijk"
mv = memoryview(b)
mv.readonly # => True
Enter fullscreen mode Exit fullscreen mode

Discussion (0)

pic
Editor guide