Author: Alex Gaynor <alex.gay...@gmail.com>
Branch: numpy-dtype-refactor
Changeset: r49460:a099f70075f5
Date: 2011-11-16 00:23 -0500
http://bitbucket.org/pypy/pypy/changeset/a099f70075f5/

Log:    allowisntantiating numpy boxes from applevel

diff --git a/pypy/module/micronumpy/interp_boxes.py 
b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -1,4 +1,5 @@
 from pypy.interpreter.baseobjspace import Wrappable
+from pypy.interpreter.error import operationerrfmt
 from pypy.interpreter.gateway import interp2app
 from pypy.interpreter.typedef import TypeDef
 from pypy.objspace.std.inttype import int_typedef
@@ -27,6 +28,17 @@
 class W_GenericBox(Wrappable):
     _attrs_ = ()
 
+    def descr__new__(space, w_subtype, w_value):
+        from pypy.module.micronumpy.interp_dtype import get_dtype_cache
+        # XXX: not correct if w_subtype is a user defined subclass of a builtin
+        # type, this whole thing feels a little wrong.
+        for dtype in get_dtype_cache(space).builtin_dtypes:
+            if w_subtype is dtype.w_box_type:
+                return dtype.coerce(space, w_value)
+        raise operationerrfmt(space.w_TypeError, "cannot create '%s' 
instances",
+            w_subtype.get_module_type_name()
+        )
+
     def descr_repr(self, space):
         return space.wrap(self.get_dtype(space).itemtype.str_format(self))
 
@@ -87,7 +99,7 @@
     pass
 
 class W_Int8Box(W_SignedIntegerBox, PrimitiveBox):
-    pass
+    get_dtype = dtype_getter("int8")
 
 class W_UInt8Box(W_UnsignedIntgerBox, PrimitiveBox):
     pass
@@ -133,6 +145,7 @@
 W_GenericBox.typedef = TypeDef("generic",
     __module__ = "numpy",
 
+    __new__ = interp2app(W_GenericBox.descr__new__.im_func),
     __repr__ = interp2app(W_GenericBox.descr_repr),
     __int__ = interp2app(W_GenericBox.descr_int),
     __float__ = interp2app(W_GenericBox.descr_float),
@@ -171,6 +184,26 @@
     __module__ = "numpy",
 )
 
+W_UInt8Box.typedef = TypeDef("uint8", W_UnsignedIntgerBox.typedef,
+    __module__ = "numpy",
+)
+
+W_Int16Box.typedef = TypeDef("int16", W_SignedIntegerBox.typedef,
+    __module__ = "numpy",
+)
+
+W_UInt16Box.typedef = TypeDef("uint16", W_UnsignedIntgerBox.typedef,
+    __module__ = "numpy",
+)
+
+W_Int32Box.typedef = TypeDef("int32", W_SignedIntegerBox.typedef,
+    __module__ = "numpy",
+)
+
+W_UInt32Box.typedef = TypeDef("uint32", W_UnsignedIntgerBox.typedef,
+    __module__ = "numpy",
+)
+
 if LONG_BIT == 32:
     long_name = "int32"
 elif LONG_BIT == 64:
@@ -179,6 +212,18 @@
     __module__ = "numpy",
 )
 
+W_ULongBox.typedef = TypeDef("u" + long_name, W_UnsignedIntgerBox.typedef,
+    __module__ = "numpy",
+)
+
 W_Int64Box.typedef = TypeDef("int64", (W_SignedIntegerBox.typedef,) + MIXIN_64,
     __module__ = "numpy",
+)
+
+W_UInt64Box.typedef = TypeDef("uint64", W_UnsignedIntgerBox.typedef,
+    __module__ = "numpy",
+)
+
+W_InexactBox.typedef = TypeDef("inexact", W_NumberBox.typedef,
+    __module__ = "numpy",
 )
\ No newline at end of file
diff --git a/pypy/module/micronumpy/test/test_dtypes.py 
b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -167,6 +167,14 @@
         raises(TypeError, type, "Foo", (dtype,), {})
 
 class AppTestTypes(BaseNumpyAppTest):
+    def test_abstract_types(self):
+        import numpy
+        raises(TypeError, numpy.generic, 0)
+        raises(TypeError, numpy.number, 0)
+        raises(TypeError, numpy.integer, 0)
+        exc = raises(TypeError, numpy.signedinteger, 0)
+        assert str(exc.value) == "cannot create 'numpy.signedinteger' 
instances"
+
     def test_int8(self):
         import numpy
 
@@ -175,3 +183,9 @@
         a = numpy.array([1, 2, 3], numpy.int8)
         assert type(a[1]) is numpy.int8
         assert numpy.dtype("int8").type is numpy.int8
+
+        x = numpy.int8(128)
+        assert x == -128
+        assert x != 128
+        assert type(x) is numpy.int8
+        assert repr(x) == "-128"
\ No newline at end of file
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to