Intro to Views#
Printing View info#
View.info() returns a formatted string of the PyObject struct of an object, and its current attributes.
from einspect import view
ls = [1, 2, 3]
v = view(ls)
print(v.info())
PyListObject(at 0x2833738):
ob_refcnt: Py_ssize_t = 5
ob_type: *PyTypeObject = &[list]
ob_item: **PyObject = &[&[1], &[2], &[3], &[NULL]]
allocated: Py_ssize_t = 4
Moving Views / objects#
All move operations require an unsafe context.
The left shift operator <<
/ <<=
can be used to copy memory from a right-side View
(or object mappable to a supported View
type) to the left-side view’s memory location.
The operation returns a new view at the left side view’s memory location, created using the right-side view type.
from einspect import view
num = 500
ls = ["abc", "def"]
v = view(num)
with v.unsafe():
v <<= ls
for i in num:
print(i)
By default, the move is offset by sizeof(Py_ssize_t) to start after ob_refcnt
.
The View.move_from
function can also be used, equivalent to the <<
operator. This function form allows an optional offset
amount to be specified.
from einspect import view
x = 750
with view(x).unsafe() as v
v.move_from(50, offset=8)
print(x) # 40
print(750) # 40
Use caution with memory moves, there is no check for whether the size of the source exceeds that of the destination. Moving from a larger object to a smaller one may write into unowned memory.