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

Reply via email to