Author: Alex Gaynor <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit