Author: Brian Kearns <[email protected]>
Branch:
Changeset: r69348:528cf66eae75
Date: 2014-02-24 02:32 -0500
http://bitbucket.org/pypy/pypy/changeset/528cf66eae75/
Log: provide dtype.isbuiltin
diff --git a/pypy/module/micronumpy/arrayimpl/sort.py
b/pypy/module/micronumpy/arrayimpl/sort.py
--- a/pypy/module/micronumpy/arrayimpl/sort.py
+++ b/pypy/module/micronumpy/arrayimpl/sort.py
@@ -12,7 +12,7 @@
from rpython.rlib.objectmodel import specialize
from pypy.interpreter.error import OperationError, oefmt
from pypy.module.micronumpy.base import W_NDimArray
-from pypy.module.micronumpy import interp_dtype, types
+from pypy.module.micronumpy import interp_dtype, types, constants as NPY
from pypy.module.micronumpy.iter import AxisIterator
INT_SIZE = rffi.sizeof(lltype.Signed)
@@ -310,9 +310,9 @@
def sort_array(arr, space, w_axis, w_order):
cache = space.fromcache(SortCache) # that populates SortClasses
itemtype = arr.dtype.itemtype
- if not arr.dtype.is_native():
- raise OperationError(space.w_NotImplementedError,
- space.wrap("sorting of non-native btyeorder not supported yet"))
+ if arr.dtype.byteorder == NPY.OPPBYTE:
+ raise oefmt(space.w_NotImplementedError,
+ "sorting of non-native byteorder not supported yet")
for tp in all_types:
if isinstance(itemtype, tp[0]):
return cache._lookup(tp)(arr, space, w_axis,
diff --git a/pypy/module/micronumpy/interp_dtype.py
b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -45,7 +45,7 @@
]
def __init__(self, itemtype, num, kind, name, char, w_box_type,
- float_type=None, byteorder=NPY.NATIVE, names=[], fields={},
+ float_type=None, byteorder=None, names=[], fields={},
size=1, shape=[], subdtype=None,
alternate_constructors=[], aliases=[]):
self.itemtype = itemtype
@@ -55,6 +55,8 @@
self.char = char
self.w_box_type = w_box_type
self.float_type = float_type
+ if byteorder is None:
+ byteorder = NPY.IGNORE if self.num == NPY.STRING else NPY.NATIVE
self.byteorder = byteorder
self.names = names
self.fields = fields
@@ -124,7 +126,10 @@
def get_float_dtype(self, space):
assert self.kind == NPY.COMPLEXLTR
assert self.float_type is not None
- return get_dtype_cache(space).dtypes_by_name[self.byteorder +
self.float_type]
+ dtype = get_dtype_cache(space).dtypes_by_name[self.float_type]
+ if self.byteorder == NPY.OPPBYTE:
+ dtype = dtype.descr_newbyteorder(space)
+ return dtype
def descr_str(self, space):
if self.fields:
@@ -158,6 +163,11 @@
def descr_get_alignment(self, space):
return space.wrap(self.itemtype.alignment)
+ def descr_get_isbuiltin(self, space):
+ if self.fields is None:
+ return space.wrap(1)
+ return space.wrap(0)
+
def descr_get_subdtype(self, space):
if self.subdtype is None:
return space.w_None
@@ -405,7 +415,8 @@
endian = newendian
itemtype = self.itemtype.__class__(endian in (NPY.NATIVE, NPY.NATBYTE))
return W_Dtype(itemtype, self.num, self.kind, self.name, self.char,
- self.w_box_type, byteorder=endian, size=self.size)
+ self.w_box_type, self.float_type, byteorder=endian,
+ size=self.size)
@specialize.arg(2)
@@ -492,10 +503,15 @@
name = space.str_w(w_dtype)
if ',' in name:
return dtype_from_spec(space, w_dtype)
+ cname = name[1:] if name[0] == NPY.OPPBYTE else name
try:
- return cache.dtypes_by_name[name]
+ dtype = cache.dtypes_by_name[cname]
except KeyError:
pass
+ else:
+ if name[0] == NPY.OPPBYTE:
+ dtype = dtype.descr_newbyteorder(space)
+ return dtype
if name[0] in 'VSUc' or name[0] in '<>=|' and name[1] in 'VSUc':
return variable_dtype(space, name)
raise oefmt(space.w_TypeError, 'data type "%s" not understood', name)
@@ -544,6 +560,7 @@
byteorder = interp_attrproperty("byteorder", cls=W_Dtype),
itemsize = GetSetProperty(W_Dtype.descr_get_itemsize),
alignment = GetSetProperty(W_Dtype.descr_get_alignment),
+ isbuiltin = GetSetProperty(W_Dtype.descr_get_isbuiltin),
subdtype = GetSetProperty(W_Dtype.descr_get_subdtype),
str = GetSetProperty(W_Dtype.descr_get_str),
@@ -874,6 +891,7 @@
# we reverse, so the stuff with lower numbers override stuff with
# higher numbers
for dtype in reversed(self.builtin_dtypes):
+ dtype.fields = None # mark these as builtin
self.dtypes_by_num[dtype.num] = dtype
self.dtypes_by_name[dtype.name] = dtype
for can_name in [dtype.kind + str(dtype.get_size()),
@@ -882,16 +900,8 @@
self.dtypes_by_name[NPY.NATBYTE + can_name] = dtype
self.dtypes_by_name[NPY.NATIVE + can_name] = dtype
self.dtypes_by_name[NPY.IGNORE + can_name] = dtype
- new_name = NPY.OPPBYTE + can_name
- itemtype = type(dtype.itemtype)(False)
- self.dtypes_by_name[new_name] = W_Dtype(
- itemtype, dtype.num, dtype.kind, new_name, dtype.char,
- dtype.w_box_type, byteorder=NPY.OPPBYTE,
- float_type=dtype.float_type)
for alias in dtype.aliases:
self.dtypes_by_name[alias] = dtype
- for dtype in self.dtypes_by_name.values():
- dtype.fields = None # mark these as builtin
typeinfo_full = {
'LONGLONG': self.w_int64dtype,
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
@@ -40,6 +40,7 @@
def test_dtype_basic(self):
from numpypy import dtype
+ import sys
d = dtype('?')
assert d.num == 0
@@ -47,6 +48,8 @@
assert dtype(d) is d
assert dtype('bool') is d
assert dtype('|b1') is d
+ b = '>' if sys.byteorder == 'little' else '<'
+ assert dtype(b + 'i4') is not dtype(b + 'i4')
assert repr(type(d)) == "<type 'numpy.dtype'>"
exc = raises(ValueError, "d.names = []")
assert exc.value[0] == "there are no fields defined"
@@ -157,6 +160,26 @@
a = array(range(5), long)
assert a.dtype is dtype(long)
+ def test_isbuiltin(self):
+ import numpy as np
+ import sys
+ assert np.dtype('?').isbuiltin == 1
+ assert np.dtype(int).newbyteorder().isbuiltin == 0
+ assert np.dtype(np.dtype(int)).isbuiltin == 1
+ assert np.dtype('=i4').isbuiltin == 1
+ b = '>' if sys.byteorder == 'little' else '<'
+ assert np.dtype(b + 'i4').isbuiltin == 0
+ assert np.dtype(b + 'i4').newbyteorder().isbuiltin == 0
+ b = '<' if sys.byteorder == 'little' else '>'
+ assert np.dtype(b + 'i4').isbuiltin == 1
+ assert np.dtype(b + 'i4').newbyteorder().isbuiltin == 0
+ assert np.dtype((int, 2)).isbuiltin == 0
+ assert np.dtype([('', int), ('', float)]).isbuiltin == 0
+ assert np.dtype('void').isbuiltin == 1
+ assert np.dtype(str).isbuiltin == 1
+ assert np.dtype('S0').isbuiltin == 1
+ assert np.dtype('S5').isbuiltin == 0
+
def test_repr_str(self):
from numpypy import dtype
@@ -837,6 +860,11 @@
assert dtype(nnp + 'i8').byteorder == nnp
assert dtype('=i8').byteorder == '='
assert dtype(byteorder + 'i8').byteorder == '='
+ assert dtype(str).byteorder == '|'
+ assert dtype('S5').byteorder == '|'
+ assert dtype('>S5').byteorder == '|'
+ assert dtype('<S5').byteorder == '|'
+ assert dtype('<S5').newbyteorder('=').byteorder == '|'
def test_dtype_str(self):
from numpypy import dtype
@@ -860,6 +888,7 @@
assert dtype('string').str == '|S0'
assert dtype('unicode').str == byteorder + 'U0'
assert dtype(('string', 7)).str == '|S7'
+ assert dtype('=S5').str == '|S5'
assert dtype(('unicode', 7)).str == '<U7'
assert dtype([('', 'f8')]).str == "|V8"
assert dtype(('f8', 2)).str == "|V16"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit