Make MemoryView Generic, make cast accurate (#12247)

This commit is contained in:
Max Muoto
2024-07-11 19:12:44 -05:00
committed by GitHub
parent 3b5b642fdb
commit 4316e00c9e
2 changed files with 75 additions and 5 deletions

View File

@@ -0,0 +1,58 @@
from __future__ import annotations
import array
from typing_extensions import assert_type
# Casting to bytes.
buf = b"abcdefg"
view = memoryview(buf).cast("c")
elm = view[0]
assert_type(elm, bytes)
assert_type(view[0:2], memoryview[bytes])
# Casting to a bool.
a = array.array("B", [0, 1, 2, 3])
mv = memoryview(a)
bool_mv = mv.cast("?")
assert_type(bool_mv[0], bool)
assert_type(bool_mv[0:2], memoryview[bool])
# Casting to a signed char.
a = array.array("B", [0, 1, 2, 3])
mv = memoryview(a)
signed_mv = mv.cast("b")
assert_type(signed_mv[0], int)
assert_type(signed_mv[0:2], memoryview[int])
# Casting to a signed short.
a = array.array("B", [0, 1, 2, 3])
mv = memoryview(a)
signed_mv = mv.cast("h")
assert_type(signed_mv[0], int)
assert_type(signed_mv[0:2], memoryview[int])
# Casting to a signed int.
a = array.array("B", [0, 1, 2, 3])
mv = memoryview(a)
signed_mv = mv.cast("i")
assert_type(signed_mv[0], int)
assert_type(signed_mv[0:2], memoryview[int])
# Casting to a signed long.
a = array.array("B", [0, 1, 2, 3])
mv = memoryview(a)
signed_mv = mv.cast("l")
assert_type(signed_mv[0], int)
assert_type(signed_mv[0:2], memoryview[int])
# Casting to a float.
a = array.array("B", [0, 1, 2, 3])
mv = memoryview(a)
float_mv = mv.cast("f")
assert_type(float_mv[0], float)
assert_type(float_mv[0:2], memoryview[float])
# An invalid literal should raise an error.
mv = memoryview(b"abc")
mv.cast("abc") # type: ignore