Repository URL to install this package:
|
Version:
0.29.7 ▾
|
# mode: run
u'''
>>> f()
>>> g()
>>> call()
>>> assignmvs()
'''
from cython.view cimport memoryview, array
from cython cimport view
from cpython.object cimport PyObject
from cpython.ref cimport Py_INCREF, Py_DECREF
cimport cython
import array as pyarray
from libc.stdlib cimport malloc, free
cdef extern from "Python.h":
cdef int PyBUF_C_CONTIGUOUS
include "../buffers/mockbuffers.pxi"
#
### Test for some coercions
#
def init_obj():
return 3
cdef passmvs(float[:,::1] mvs, object foo):
mvs = array((10,10), itemsize=sizeof(float), format='f')
foo = init_obj()
cdef object returnobj():
cdef obj = object()
return obj
cdef float[::1] returnmvs_inner():
return array((10,), itemsize=sizeof(float), format='f')
cdef float[::1] returnmvs():
cdef float[::1] mvs = returnmvs_inner()
return mvs
def f():
cdef array arr = array(shape=(10,10), itemsize=sizeof(int), format='i')
cdef memoryview mv = memoryview(arr, PyBUF_C_CONTIGUOUS)
def g():
cdef object obj = init_obj()
cdef int[::1] mview = array((10,), itemsize=sizeof(int), format='i')
obj = init_obj()
mview = array((10,), itemsize=sizeof(int), format='i')
cdef class ExtClass(object):
cdef int[::1] mview
def __init__(self):
self.mview = array((10,), itemsize=sizeof(int), format='i')
self.mview = array((10,), itemsize=sizeof(int), format='i')
class PyClass(object):
def __init__(self):
self.mview = array((10,), itemsize=sizeof(long), format='l')
cdef cdg():
cdef double[::1] dmv = array((10,), itemsize=sizeof(double), format='d')
dmv = array((10,), itemsize=sizeof(double), format='d')
cdef class TestExcClassExternalDtype(object):
cdef ext_dtype[:, :] arr_float
cdef td_h_double[:, :] arr_double
def __init__(self):
self.arr_float = array((10, 10), itemsize=sizeof(ext_dtype), format='f')
self.arr_float[:] = 0.0
self.arr_float[4, 4] = 2.0
self.arr_double = array((10, 10), itemsize=sizeof(td_h_double), format='d')
self.arr_double[:] = 0.0
self.arr_double[4, 4] = 2.0
def test_external_dtype():
"""
>>> test_external_dtype()
2.0
2.0
"""
cdef TestExcClassExternalDtype obj = TestExcClassExternalDtype()
print obj.arr_float[4, 4]
print obj.arr_double[4, 4]
cdef class ExtClassMockedAttr(object):
cdef int[:, :] arr
def __init__(self):
self.arr = IntMockBuffer("self.arr", range(100), (10, 8))
self.arr[:] = 0
self.arr[4, 4] = 2
cdef int[:, :] _coerce_to_temp():
cdef ExtClassMockedAttr obj = ExtClassMockedAttr()
return obj.arr
def test_coerce_to_temp():
"""
>>> test_coerce_to_temp()
acquired self.arr
released self.arr
<BLANKLINE>
acquired self.arr
released self.arr
<BLANKLINE>
acquired self.arr
released self.arr
2
<BLANKLINE>
acquired self.arr
released self.arr
2
<BLANKLINE>
acquired self.arr
released self.arr
2
"""
_coerce_to_temp()[:] = 0
print
_coerce_to_temp()[...] = 0
print
print _coerce_to_temp()[4, 4]
print
print _coerce_to_temp()[..., 4][4]
print
print _coerce_to_temp()[4][4]
def test_extclass_attribute_dealloc():
"""
>>> test_extclass_attribute_dealloc()
acquired self.arr
2
released self.arr
"""
cdef ExtClassMockedAttr obj = ExtClassMockedAttr()
print obj.arr[4, 4]
cdef float[:,::1] global_mv = array((10,10), itemsize=sizeof(float), format='f')
global_mv = array((10,10), itemsize=sizeof(float), format='f')
cdef object global_obj
def assignmvs():
cdef int[::1] mv1, mv2
cdef int[:] mv3
mv1 = array((10,), itemsize=sizeof(int), format='i')
mv2 = mv1
mv1 = mv2
mv3 = mv2
def call():
global global_mv
passmvs(global_mv, global_obj)
global_mv = array((3,3), itemsize=sizeof(float), format='f')
cdef float[::1] getmvs = returnmvs()
returnmvs()
cdef object obj = returnobj()
cdg()
f = ExtClass()
pf = PyClass()
cdef ExtClass get_ext_obj():
print 'get_ext_obj called'
return ExtClass.__new__(ExtClass)
def test_cdef_attribute():
"""
>>> test_cdef_attribute()
Memoryview is not initialized
local variable 'myview' referenced before assignment
local variable 'myview' referenced before assignment
get_ext_obj called
Memoryview is not initialized
<MemoryView of 'array' object>
"""
cdef ExtClass extobj = ExtClass.__new__(ExtClass)
try:
print extobj.mview
except AttributeError, e:
print e.args[0]
else:
print "No AttributeError was raised"
cdef int[:] myview
try:
print myview
except UnboundLocalError, e:
print e.args[0]
else:
print "No UnboundLocalError was raised"
cdef int[:] otherview
try:
otherview = myview
except UnboundLocalError, e:
print e.args[0]
try:
print get_ext_obj().mview
except AttributeError, e:
print e.args[0]
else:
print "No AttributeError was raised"
print ExtClass().mview
@cython.boundscheck(False)
def test_nogil_unbound_localerror():
"""
>>> test_nogil_unbound_localerror()
Traceback (most recent call last):
...
UnboundLocalError: local variable 'm' referenced before assignment
"""
cdef int[:] m
with nogil:
m[0] = 10
def test_nogil_oob():
"""
>>> test_nogil_oob()
Traceback (most recent call last):
...
IndexError: Out of bounds on buffer access (axis 0)
"""
cdef int[5] a
cdef int[:] m = a
with nogil:
m[5] = 1
def basic_struct(MyStruct[:] mslice):
"""
See also buffmt.pyx
>>> basic_struct(MyStructMockBuffer(None, [(1, 2, 3, 4, 5)]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
>>> basic_struct(MyStructMockBuffer(None, [(1, 2, 3, 4, 5)], format="ccqii"))
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
"""
buf = mslice
print sorted([(k, int(v)) for k, v in buf[0].items()])
def nested_struct(NestedStruct[:] mslice):
"""
See also buffmt.pyx
>>> nested_struct(NestedStructMockBuffer(None, [(1, 2, 3, 4, 5)]))
1 2 3 4 5
>>> nested_struct(NestedStructMockBuffer(None, [(1, 2, 3, 4, 5)], format="T{ii}T{2i}i"))
1 2 3 4 5
"""
buf = mslice
d = buf[0]
print d['x']['a'], d['x']['b'], d['y']['a'], d['y']['b'], d['z']
def packed_struct(PackedStruct[:] mslice):
"""
See also buffmt.pyx
>>> packed_struct(PackedStructMockBuffer(None, [(1, 2)]))
1 2
>>> packed_struct(PackedStructMockBuffer(None, [(1, 2)], format="T{c^i}"))
1 2
>>> packed_struct(PackedStructMockBuffer(None, [(1, 2)], format="T{c=i}"))
1 2
"""
buf = mslice
print buf[0]['a'], buf[0]['b']
def nested_packed_struct(NestedPackedStruct[:] mslice):
"""
See also buffmt.pyx
>>> nested_packed_struct(NestedPackedStructMockBuffer(None, [(1, 2, 3, 4, 5)]))
1 2 3 4 5
>>> nested_packed_struct(NestedPackedStructMockBuffer(None, [(1, 2, 3, 4, 5)], format="ci^ci@i"))
1 2 3 4 5
>>> nested_packed_struct(NestedPackedStructMockBuffer(None, [(1, 2, 3, 4, 5)], format="^c@i^ci@i"))
1 2 3 4 5
"""
buf = mslice
d = buf[0]
print d['a'], d['b'], d['sub']['a'], d['sub']['b'], d['c']
def complex_dtype(long double complex[:] mslice):
"""
>>> complex_dtype(LongComplexMockBuffer(None, [(0, -1)]))
-1j
"""
buf = mslice
print buf[0]
def complex_inplace(long double complex[:] mslice):
"""
>>> complex_inplace(LongComplexMockBuffer(None, [(0, -1)]))
(1+1j)
"""
buf = mslice
buf[0] = buf[0] + 1 + 2j
print buf[0]
def complex_struct_dtype(LongComplex[:] mslice):
"""
Note that the format string is "Zg" rather than "2g", yet a struct
is accessed.
>>> complex_struct_dtype(LongComplexMockBuffer(None, [(0, -1)]))
0.0 -1.0
"""
buf = mslice
print buf[0]['real'], buf[0]['imag']
#
# Getting items and index bounds checking
#
def get_int_2d(int[:, :] mslice, int i, int j):
"""
>>> C = IntMockBuffer("C", range(6), (2,3))
>>> get_int_2d(C, 1, 1)
acquired C
released C
4
Check negative indexing:
>>> get_int_2d(C, -1, 0)
acquired C
released C
3
>>> get_int_2d(C, -1, -2)
acquired C
released C
4
>>> get_int_2d(C, -2, -3)
acquired C
released C
0
Out-of-bounds errors:
>>> get_int_2d(C, 2, 0)
Traceback (most recent call last):
...
IndexError: Out of bounds on buffer access (axis 0)
>>> get_int_2d(C, 0, -4)
Traceback (most recent call last):
...
IndexError: Out of bounds on buffer access (axis 1)
"""
buf = mslice
return buf[i, j]
def set_int_2d(int[:, :] mslice, int i, int j, int value):
"""
Uses get_int_2d to read back the value afterwards. For pure
unit test, one should support reading in MockBuffer instead.
>>> C = IntMockBuffer("C", range(6), (2,3))
>>> set_int_2d(C, 1, 1, 10)
acquired C
released C
>>> get_int_2d(C, 1, 1)
acquired C
released C
10
Check negative indexing:
>>> set_int_2d(C, -1, 0, 3)
acquired C
released C
>>> get_int_2d(C, -1, 0)
acquired C
released C
3
>>> set_int_2d(C, -1, -2, 8)
acquired C
released C
>>> get_int_2d(C, -1, -2)
acquired C
released C
8
>>> set_int_2d(C, -2, -3, 9)
acquired C
released C
>>> get_int_2d(C, -2, -3)
acquired C
released C
9
Out-of-bounds errors:
>>> set_int_2d(C, 2, 0, 19)
Traceback (most recent call last):
...
IndexError: Out of bounds on buffer access (axis 0)
>>> set_int_2d(C, 0, -4, 19)
Traceback (most recent call last):
...
IndexError: Out of bounds on buffer access (axis 1)
"""
buf = mslice
buf[i, j] = value
#
# Test all kinds of indexing and flags
#
def writable(unsigned short int[:, :, :] mslice):
"""
>>> R = UnsignedShortMockBuffer("R", range(27), shape=(3, 3, 3))
>>> writable(R)
acquired R
released R
>>> [str(x) for x in R.received_flags] # Py2/3
['FORMAT', 'ND', 'STRIDES', 'WRITABLE']
"""
buf = mslice
buf[2, 2, 1] = 23
def strided(int[:] mslice):
"""
>>> A = IntMockBuffer("A", range(4))
>>> strided(A)
acquired A
released A
2
Check that the suboffsets were patched back prior to release.
>>> A.release_ok
True
"""
buf = mslice
return buf[2]
def c_contig(int[::1] mslice):
"""
>>> A = IntMockBuffer(None, range(4))
>>> c_contig(A)
2
"""
buf = mslice
return buf[2]
def c_contig_2d(int[:, ::1] mslice):
"""
Multi-dim has separate implementation
>>> A = IntMockBuffer(None, range(12), shape=(3,4))
>>> c_contig_2d(A)
7
"""
buf = mslice
return buf[1, 3]
def f_contig(int[::1, :] mslice):
"""
>>> A = IntMockBuffer(None, range(4), shape=(2, 2), strides=(1, 2))
>>> f_contig(A)
2
"""
buf = mslice
return buf[0, 1]
def f_contig_2d(int[::1, :] mslice):
"""
Must set up strides manually to ensure Fortran ordering.
>>> A = IntMockBuffer(None, range(12), shape=(4,3), strides=(1, 4))
>>> f_contig_2d(A)
7
"""
buf = mslice
return buf[3, 1]
def generic(int[::view.generic, ::view.generic] mslice1,
int[::view.generic, ::view.generic] mslice2):
"""
>>> A = IntMockBuffer("A", [[0,1,2], [3,4,5], [6,7,8]])
>>> B = IntMockBuffer("B", [[0,1,2], [3,4,5], [6,7,8]], shape=(3, 3), strides=(1, 3))
>>> generic(A, B)
acquired A
acquired B
4
4
10
11
released A
released B
"""
buf1, buf2 = mslice1, mslice2
print buf1[1, 1]
print buf2[1, 1]
buf1[2, -1] = 10
buf2[2, -1] = 11
print buf1[2, 2]
print buf2[2, 2]
#def generic_contig(int[::view.generic_contiguous, :] mslice1,
# int[::view.generic_contiguous, :] mslice2):
# """
# >>> A = IntMockBuffer("A", [[0,1,2], [3,4,5], [6,7,8]])
# >>> B = IntMockBuffer("B", [[0,1,2], [3,4,5], [6,7,8]], shape=(3, 3), strides=(1, 3))
# >>> generic_contig(A, B)
# acquired A
# acquired B
# 4
# 4
# 10
# 11
# released A
# released B
# """
# buf1, buf2 = mslice1, mslice2
#
# print buf1[1, 1]
# print buf2[1, 1]
#
# buf1[2, -1] = 10
# buf2[2, -1] = 11
#
# print buf1[2, 2]
# print buf2[2, 2]
ctypedef int td_cy_int
cdef extern from "bufaccess.h":
ctypedef td_cy_int td_h_short # Defined as short, but Cython doesn't know this!
ctypedef float td_h_double # Defined as double
ctypedef unsigned int td_h_ushort # Defined as unsigned short
ctypedef td_h_short td_h_cy_short
def printbuf_td_cy_int(td_cy_int[:] mslice, shape):
"""
>>> printbuf_td_cy_int(IntMockBuffer(None, range(3)), (3,))
0 1 2 END
>>> printbuf_td_cy_int(ShortMockBuffer(None, range(3)), (3,))
Traceback (most recent call last):
...
ValueError: Buffer dtype mismatch, expected 'td_cy_int' but got 'short'
"""
buf = mslice
cdef int i
for i in range(shape[0]):
print buf[i],
print 'END'
def printbuf_td_h_short(td_h_short[:] mslice, shape):
"""
>>> printbuf_td_h_short(ShortMockBuffer(None, range(3)), (3,))
0 1 2 END
>>> printbuf_td_h_short(IntMockBuffer(None, range(3)), (3,))
Traceback (most recent call last):
...
ValueError: Buffer dtype mismatch, expected 'td_h_short' but got 'int'
"""
buf = mslice
cdef int i
for i in range(shape[0]):
print buf[i],
print 'END'
def printbuf_td_h_cy_short(td_h_cy_short[:] mslice, shape):
"""
>>> printbuf_td_h_cy_short(ShortMockBuffer(None, range(3)), (3,))
0 1 2 END
>>> printbuf_td_h_cy_short(IntMockBuffer(None, range(3)), (3,))
Traceback (most recent call last):
...
ValueError: Buffer dtype mismatch, expected 'td_h_cy_short' but got 'int'
"""
buf = mslice
cdef int i
for i in range(shape[0]):
print buf[i],
print 'END'
def printbuf_td_h_ushort(td_h_ushort[:] mslice, shape):
"""
>>> printbuf_td_h_ushort(UnsignedShortMockBuffer(None, range(3)), (3,))
0 1 2 END
>>> printbuf_td_h_ushort(ShortMockBuffer(None, range(3)), (3,))
Traceback (most recent call last):
...
ValueError: Buffer dtype mismatch, expected 'td_h_ushort' but got 'short'
"""
buf = mslice
cdef int i
for i in range(shape[0]):
print buf[i],
print 'END'
def printbuf_td_h_double(td_h_double[:] mslice, shape):
"""
>>> printbuf_td_h_double(DoubleMockBuffer(None, [0.25, 1, 3.125]), (3,))
0.25 1.0 3.125 END
>>> printbuf_td_h_double(FloatMockBuffer(None, [0.25, 1, 3.125]), (3,))
Traceback (most recent call last):
...
ValueError: Buffer dtype mismatch, expected 'td_h_double' but got 'float'
"""
buf = mslice
cdef int i
for i in range(shape[0]):
print buf[i],
print 'END'
#
# Object access
#
def addref(*args):
for item in args: Py_INCREF(item)
def decref(*args):
for item in args: Py_DECREF(item)
def get_refcount(x):
return (<PyObject*>x).ob_refcnt
def printbuf_object(object[:] mslice, shape):
"""
Only play with unique objects, interned numbers etc. will have
unpredictable refcounts.
ObjectMockBuffer doesn't do anything about increfing/decrefing,
we to the "buffer implementor" refcounting directly in the
testcase.
>>> a, b, c = "globally_unique_string_23234123", {4:23}, [34,3]
>>> get_refcount(a), get_refcount(b), get_refcount(c)
(2, 2, 2)
>>> A = ObjectMockBuffer(None, [a, b, c])
>>> printbuf_object(A, (3,))
'globally_unique_string_23234123' 2
{4: 23} 2
[34, 3] 2
"""
buf = mslice
cdef int i
for i in range(shape[0]):
print repr(buf[i]), (<PyObject*>buf[i]).ob_refcnt
def assign_to_object(object[:] mslice, int idx, obj):
"""
See comments on printbuf_object above.
>>> a, b = [1, 2, 3], [4, 5, 6]
>>> get_refcount(a), get_refcount(b)
(2, 2)
>>> addref(a)
>>> A = ObjectMockBuffer(None, [1, a]) # 1, ...,otherwise it thinks nested lists...
>>> get_refcount(a), get_refcount(b)
(3, 2)
>>> assign_to_object(A, 1, b)
>>> get_refcount(a), get_refcount(b)
(2, 3)
>>> decref(b)
"""
buf = mslice
buf[idx] = obj
def assign_temporary_to_object(object[:] mslice):
"""
See comments on printbuf_object above.
>>> a, b = [1, 2, 3], {4:23}
>>> get_refcount(a)
2
>>> addref(a)
>>> A = ObjectMockBuffer(None, [b, a])
>>> get_refcount(a)
3
>>> assign_temporary_to_object(A)
>>> get_refcount(a)
2
>>> printbuf_object(A, (2,))
{4: 23} 2
{1: 8} 2
To avoid leaking a reference in our testcase we need to
replace the temporary with something we can manually decref :-)
>>> assign_to_object(A, 1, a)
>>> decref(a)
"""
buf = mslice
buf[1] = {3-2: 2+(2*4)-2}
def test_generic_slicing(arg, indirect=False):
"""
Test simple slicing
>>> test_generic_slicing(IntMockBuffer("A", range(8 * 14 * 11), shape=(8, 14, 11)))
acquired A
(3, 9, 2)
308 -11 1
-1 -1 -1
released A
Test direct slicing, negative slice oob in dim 2
>>> test_generic_slicing(IntMockBuffer("A", range(1 * 2 * 3), shape=(1, 2, 3)))
acquired A
(0, 0, 2)
12 -3 1
-1 -1 -1
released A
Test indirect slicing
>>> test_generic_slicing(IntMockBuffer("A", shape_5_3_4_list, shape=(5, 3, 4)), indirect=True)
acquired A
(2, 0, 2)
0 1 -1
released A
>>> stride1 = 21 * 14
>>> stride2 = 21
>>> test_generic_slicing(IntMockBuffer("A", shape_9_14_21_list, shape=(9, 14, 21)), indirect=True)
acquired A
(3, 9, 2)
10 1 -1
released A
"""
cdef int[::view.generic, ::view.generic, :] _a = arg
a = _a
b = a[2:8:2, -4:1:-1, 1:3]
print b.shape
if indirect:
print b.suboffsets[0] // sizeof(int *),
print b.suboffsets[1] // sizeof(int),
print b.suboffsets[2]
else:
print_int_offsets(b.strides[0], b.strides[1], b.strides[2])
print_int_offsets(b.suboffsets[0], b.suboffsets[1], b.suboffsets[2])
cdef int i, j, k
for i in range(b.shape[0]):
for j in range(b.shape[1]):
for k in range(b.shape[2]):
itemA = a[2 + 2 * i, -4 - j, 1 + k]
itemB = b[i, j, k]
assert itemA == itemB, (i, j, k, itemA, itemB)
def test_indirect_slicing(arg):
"""
Test indirect slicing
>>> test_indirect_slicing(IntMockBuffer("A", shape_5_3_4_list, shape=(5, 3, 4)))
acquired A
(5, 3, 2)
0 0 -1
58
56
58
58
58
58
released A
>>> test_indirect_slicing(IntMockBuffer("A", shape_9_14_21_list, shape=(9, 14, 21)))
acquired A
(5, 14, 3)
0 16 -1
2412
2410
2412
2412
2412
2412
released A
"""
cdef int[::view.indirect, ::view.indirect, :] _a = arg
a = _a
b = a[-5:, ..., -5:100:2]
print b.shape
print_int_offsets(*b.suboffsets)
print b[4, 2, 1]
print b[..., 0][4, 2]
print b[..., 1][4, 2]
print b[..., 1][4][2]
print b[4][2][1]
print b[4, 2][1]
def test_direct_slicing(arg):
"""
Fused types would be convenient to test this stuff!
Test simple slicing
>>> test_direct_slicing(IntMockBuffer("A", range(8 * 14 * 11), shape=(8, 14, 11)))
acquired A
(3, 9, 2)
308 -11 1
-1 -1 -1
released A
Test direct slicing, negative slice oob in dim 2
>>> test_direct_slicing(IntMockBuffer("A", range(1 * 2 * 3), shape=(1, 2, 3)))
acquired A
(0, 0, 2)
12 -3 1
-1 -1 -1
released A
"""
cdef int[:, :, :] _a = arg
a = _a
b = a[2:8:2, -4:1:-1, 1:3]
print b.shape
print_int_offsets(*b.strides)
print_int_offsets(*b.suboffsets)
cdef int i, j, k
for i in range(b.shape[0]):
for j in range(b.shape[1]):
for k in range(b.shape[2]):
itemA = a[2 + 2 * i, -4 - j, 1 + k]
itemB = b[i, j, k]
assert itemA == itemB, (i, j, k, itemA, itemB)
def test_slicing_and_indexing(arg):
"""
>>> a = IntStridedMockBuffer("A", range(10 * 3 * 5), shape=(10, 3, 5))
>>> test_slicing_and_indexing(a)
acquired A
(5, 2)
15 2
126 113
[111]
released A
"""
cdef int[:, :, :] _a = arg
a = _a
b = a[-5:, 1, 1::2]
c = b[4:1:-1, ::-1]
d = c[2, 1:2]
print b.shape
print_int_offsets(*b.strides)
cdef int i, j
for i in range(b.shape[0]):
for j in range(b.shape[1]):
itemA = a[-5 + i, 1, 1 + 2 * j]
itemB = b[i, j]
assert itemA == itemB, (i, j, itemA, itemB)
print c[1, 1], c[2, 0]
print [d[i] for i in range(d.shape[0])]
def test_oob():
"""
>>> test_oob()
Traceback (most recent call last):
...
IndexError: Index out of bounds (axis 1)
"""
cdef int[:, :] a = IntMockBuffer("A", range(4 * 9), shape=(4, 9))
print a[:, 20]
def test_acquire_memoryview():
"""
Segfaulting in 3.2?
>> test_acquire_memoryview()
acquired A
22
<MemoryView of 'IntMockBuffer' object>
22
22
released A
"""
cdef int[:, :] a = IntMockBuffer("A", range(4 * 9), shape=(4, 9))
cdef object b = a
print a[2, 4]
# Make sure we don't have to keep this around
del a
print b
cdef int[:, :] c = b
print b[2, 4]
print c[2, 4]
def test_acquire_memoryview_slice():
"""
>>> test_acquire_memoryview_slice()
acquired A
31
<MemoryView of 'IntMockBuffer' object>
31
31
released A
"""
cdef int[:, :] a = IntMockBuffer("A", range(4 * 9), shape=(4, 9))
a = a[1:, :6]
cdef object b = a
print a[2, 4]
# Make sure we don't have to keep this around
del a
print b
cdef int[:, :] c = b
print b[2, 4]
print c[2, 4]
class SingleObject(object):
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
def __eq__(self, other):
return self.value == getattr(other, 'value', None) or self.value == other
def test_assign_scalar(int[:, :] m):
"""
>>> A = IntMockBuffer("A", [0] * 100, shape=(10, 10))
>>> test_assign_scalar(A)
acquired A
1 1 1 4 1 6 1 1 1 1
2 2 2 4 2 6 2 2 2 2
3 3 3 4 3 6 3 3 3 3
1 1 1 4 1 6 1 1 1 1
5 5 5 5 5 6 5 5 5 5
1 1 1 4 1 6 1 1 1 1
released A
"""
m[:, :] = 1
m[1, :] = 2
m[2, :] = 3
m[:, 3] = 4
m[4, ...] = 5
m[..., 5] = 6
for i in range(6):
print " ".join([str(m[i, j]) for j in range(m.shape[1])])
def test_contig_scalar_to_slice_assignment():
"""
>>> test_contig_scalar_to_slice_assignment()
14 14 14 14
20 20 20 20
"""
cdef int[5][10] a
cdef int[:, ::1] _m = a
m = _m
m[...] = 14
print m[0, 0], m[-1, -1], m[3, 2], m[4, 9]
m[:, :] = 20
print m[0, 0], m[-1, -1], m[3, 2], m[4, 9]
def test_dtype_object_scalar_assignment():
"""
>>> test_dtype_object_scalar_assignment()
"""
cdef object[:] m = array((10,), sizeof(PyObject *), 'O')
m[:] = SingleObject(2)
assert m[0] == m[4] == m[-1] == 2
(<object> m)[:] = SingleObject(3)
assert m[0] == m[4] == m[-1] == 3
def test_assignment_in_conditional_expression(bint left):
"""
>>> test_assignment_in_conditional_expression(True)
1.0
2.0
1.0
2.0
>>> test_assignment_in_conditional_expression(False)
3.0
4.0
3.0
4.0
"""
cdef double a[2]
cdef double b[2]
a[:] = [1, 2]
b[:] = [3, 4]
cdef double[:] A = a
cdef double[:] B = b
cdef double[:] C, c
# assign new memoryview references
C = A if left else B
for i in range(C.shape[0]):
print C[i]
# create new memoryviews
c = a if left else b
for i in range(c.shape[0]):
print c[i]
def test_cpython_offbyone_issue_23349():
"""
>>> print(test_cpython_offbyone_issue_23349())
testing
"""
cdef unsigned char[:] v = bytearray(b"testing")
# the following returns 'estingt' without the workaround
return bytearray(v).decode('ascii')
@cython.test_fail_if_path_exists('//SimpleCallNode')
@cython.test_assert_path_exists(
'//ReturnStatNode//TupleNode',
'//ReturnStatNode//TupleNode//CondExprNode',
)
def min_max_tree_restructuring():
"""
>>> min_max_tree_restructuring()
(1, 3)
"""
cdef char a[5]
a = [1, 2, 3, 4, 5]
cdef char[:] aview = a
return max(<char>1, aview[0]), min(<char>5, aview[2])
@cython.test_fail_if_path_exists(
'//MemoryViewSliceNode',
)
@cython.test_assert_path_exists(
'//MemoryViewIndexNode',
)
#@cython.boundscheck(False) # reduce C code clutter
def optimised_index_of_slice(int[:,:,:] arr, int x, int y, int z):
"""
>>> arr = IntMockBuffer("A", list(range(10*10*10)), shape=(10,10,10))
>>> optimised_index_of_slice(arr, 2, 3, 4)
acquired A
(123, 123)
(223, 223)
(133, 133)
(124, 124)
(234, 234)
(123, 123)
(123, 123)
(123, 123)
(134, 134)
(134, 134)
(234, 234)
(234, 234)
(234, 234)
released A
"""
print(arr[1, 2, 3], arr[1][2][3])
print(arr[x, 2, 3], arr[x][2][3])
print(arr[1, y, 3], arr[1][y][3])
print(arr[1, 2, z], arr[1][2][z])
print(arr[x, y, z], arr[x][y][z])
print(arr[1, 2, 3], arr[:, 2][1][3])
print(arr[1, 2, 3], arr[:, 2, :][1, 3])
print(arr[1, 2, 3], arr[:, 2, 3][1])
print(arr[1, y, z], arr[1, :][y][z])
print(arr[1, y, z], arr[1, :][y, z])
print(arr[x, y, z], arr[x][:][:][y][:][:][z])
print(arr[x, y, z], arr[:][x][:][y][:][:][z])
print(arr[x, y, z], arr[:, :][x][:, :][y][:][z])
def test_assign_from_byteslike(byteslike):
# Once http://python3statement.org is accepted, should be just
# >>> test_assign_from_byteslike(bytes(b'hello'))
# b'hello'
# ...
"""
>>> print(test_assign_from_byteslike(bytes(b'hello')).decode())
hello
>>> print(test_assign_from_byteslike(bytearray(b'howdy')).decode())
howdy
"""
# fails on Python 2.7- with
# TypeError: an integer is required
# >>> print(test_assign_from_byteslike(pyarray.array('B', b'aloha')).decode())
# aloha
# fails on Python 2.6- with
# NameError: name 'memoryview' is not defined
# >>> print(test_assign_from_byteslike(memoryview(b'bye!!')).decode())
# bye!!
def assign(m):
m[:] = byteslike
cdef void *buf
cdef unsigned char[:] mview
buf = malloc(5)
try:
mview = <unsigned char[:5]>(buf)
assign(mview)
return (<unsigned char*>buf)[:5]
finally:
free(buf)