Author: Brian Kearns <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit