Author: Brian Kearns <bdkea...@gmail.com> Branch: Changeset: r67993:49ca29878cd3 Date: 2013-11-12 16:24 -0500 http://bitbucket.org/pypy/pypy/changeset/49ca29878cd3/
Log: add basic ndarray.flags object diff --git a/pypy/module/micronumpy/interp_flagsobj.py b/pypy/module/micronumpy/interp_flagsobj.py new file mode 100644 --- /dev/null +++ b/pypy/module/micronumpy/interp_flagsobj.py @@ -0,0 +1,45 @@ +from pypy.interpreter.baseobjspace import W_Root +from pypy.interpreter.typedef import TypeDef, GetSetProperty +from pypy.interpreter.gateway import interp2app +from pypy.interpreter.error import OperationError + + +class W_FlagsObject(W_Root): + def __init__(self, arr): + self.arr = arr + + def descr_get_contiguous(self, space): + return space.w_True + + def descr_get_fortran(self, space): + return space.w_False + + def descr_get_writeable(self, space): + return space.w_True + + def descr_getitem(self, space, w_item): + key = space.str_w(w_item) + if key == "C" or key == "CONTIGUOUS" or key == "C_CONTIGUOUS": + return self.descr_get_contiguous(space) + if key == "F" or key == "FORTRAN" or key == "F_CONTIGUOUS": + return self.descr_get_fortran(space) + if key == "W" or key == "WRITEABLE": + return self.descr_get_writeable(space) + raise OperationError(space.w_KeyError, space.wrap( + "Unknown flag")) + + def descr_setitem(self, space, w_item, w_value): + raise OperationError(space.w_KeyError, space.wrap( + "Unknown flag")) + +W_FlagsObject.typedef = TypeDef("flagsobj", + __module__ = "numpy", + __getitem__ = interp2app(W_FlagsObject.descr_getitem), + __setitem__ = interp2app(W_FlagsObject.descr_setitem), + + contiguous = GetSetProperty(W_FlagsObject.descr_get_contiguous), + c_contiguous = GetSetProperty(W_FlagsObject.descr_get_contiguous), + f_contiguous = GetSetProperty(W_FlagsObject.descr_get_fortran), + fortran = GetSetProperty(W_FlagsObject.descr_get_fortran), + writeable = GetSetProperty(W_FlagsObject.descr_get_writeable), +) diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py --- a/pypy/module/micronumpy/interp_numarray.py +++ b/pypy/module/micronumpy/interp_numarray.py @@ -9,6 +9,7 @@ from pypy.module.micronumpy.strides import find_shape_and_elems,\ get_shape_from_iterable, to_coords, shape_agreement, \ shape_agreement_multiple +from pypy.module.micronumpy.interp_flagsobj import W_FlagsObject from pypy.module.micronumpy.interp_flatiter import W_FlatIterator from pypy.module.micronumpy.appbridge import get_appbridge_cache from pypy.module.micronumpy import loop @@ -610,13 +611,11 @@ raise OperationError(space.w_NotImplementedError, space.wrap( "dumps not implemented yet")) + w_flags = None def descr_get_flags(self, space): - raise OperationError(space.w_NotImplementedError, space.wrap( - "getting flags not implemented yet")) - - def descr_set_flags(self, space, w_args): - raise OperationError(space.w_NotImplementedError, space.wrap( - "setting flags not implemented yet")) + if self.w_flags is None: + self.w_flags = W_FlagsObject(self) + return self.w_flags @unwrap_spec(offset=int) def descr_getfield(self, space, w_dtype, offset): @@ -1203,6 +1202,7 @@ size = GetSetProperty(W_NDimArray.descr_get_size), itemsize = GetSetProperty(W_NDimArray.descr_get_itemsize), nbytes = GetSetProperty(W_NDimArray.descr_get_nbytes), + flags = GetSetProperty(W_NDimArray.descr_get_flags), fill = interp2app(W_NDimArray.descr_fill), tostring = interp2app(W_NDimArray.descr_tostring), diff --git a/pypy/module/micronumpy/test/test_flagsobj.py b/pypy/module/micronumpy/test/test_flagsobj.py new file mode 100644 --- /dev/null +++ b/pypy/module/micronumpy/test/test_flagsobj.py @@ -0,0 +1,17 @@ +from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest + + +class AppTestFlagsObj(BaseNumpyAppTest): + def test_repr(self): + import numpy as np + a = np.array([1,2,3]) + assert repr(type(a.flags)) == "<type 'numpy.flagsobj'>" + + def test_flags(self): + import numpy as np + a = np.array([1,2,3]) + assert a.flags.c_contiguous == True + assert a.flags['W'] == True + raises(KeyError, "a.flags['blah']") + raises(KeyError, "a.flags['C_CONTIGUOUS'] = False") + raises((TypeError, AttributeError), "a.flags.c_contiguous = False") _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit