# mode: run # tag: readonly, const, numpy import numpy as np def new_array(): return np.arange(10).astype('float') ARRAY = new_array() cdef getmax(const double[:] x): """Example code, should work with both ro and rw memoryviews""" cdef double max_val = -float('inf') for val in x: if val > max_val: max_val = val return max_val cdef update_array(double [:] x): """Modifying a ro memoryview should raise an error""" x[0] = 23. cdef getconst(const double [:] x): """Should accept ro memoryviews""" return x[0] def test_mmview_rw(x): """ >>> test_mmview_rw(ARRAY) 9.0 """ return getmax(x) def test_mmview_ro(x): """ >>> test_mmview_ro(new_array()) 9.0 """ x.setflags(write=False) assert x.flags.writeable is False return getmax(x) def test_update_mmview_rw(x): """ >>> test_update_mmview_rw(new_array()) 23.0 """ update_array(x) return x[0] def test_update_mmview_ro(x): """ >>> test_update_mmview_ro(new_array()) 0.0 """ x.setflags(write=False) assert x.flags.writeable is False try: update_array(x) except ValueError: pass else: assert False, "RO error not raised!" return getconst(x) def test_rw_call_getmax(double[:] x): """ >>> test_rw_call_getmax(new_array()) 23.0 """ update_array(x) assert getconst(x) == 23 return getmax(x) def test_const_mmview_ro(x): """ >>> test_const_mmview_ro(new_array()) 0.0 """ x.setflags(write=False) assert x.flags.writeable is False return getconst(x) def test_two_views(x): """ >>> test_two_views(new_array()) 23.0 """ cdef double[:] rw = x cdef const double[:] ro = rw rw[0] = 23 return ro[0] def test_assign_ro_to_rw(x): """ >>> test_assign_ro_to_rw(new_array()) 2.0 """ cdef const double[:] ro = x cdef double[:] rw = np.empty_like(ro) rw[:] = ro return rw[2]