Author: Brian Kearns <bdkea...@gmail.com> Branch: Changeset: r69274:f437d5038346 Date: 2014-02-22 17:24 -0500 http://bitbucket.org/pypy/pypy/changeset/f437d5038346/
Log: support auto naming record dtype fields 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 @@ -357,8 +357,8 @@ fields = {} offset = 0 fieldnames = [] - for w_elem in lst_w: - size = 1 + for i in range(len(lst_w)): + w_elem = lst_w[i] w_shape = space.newtuple([]) if space.len_w(w_elem) == 3: w_fldname, w_flddesc, w_shape = space.fixedview(w_elem) @@ -368,11 +368,13 @@ w_fldname, w_flddesc = space.fixedview(w_elem, 2) subdtype = descr__new__(space, space.gettypefor(W_Dtype), w_flddesc, w_shape=w_shape) fldname = space.str_w(w_fldname) + if fldname == '': + fldname = 'f%d' % i if fldname in fields: - raise OperationError(space.w_ValueError, space.wrap("two fields with the same name")) + raise oefmt(space.w_ValueError, "two fields with the same name") assert isinstance(subdtype, W_Dtype) fields[fldname] = (offset, subdtype) - offset += subdtype.get_size() * size + offset += subdtype.get_size() fieldnames.append(fldname) itemtype = types.RecordType() return W_Dtype(itemtype, NPY_VOID, NPY_VOIDLTR, 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 @@ -991,6 +991,8 @@ assert d.type is void assert d.char == 'V' assert d.names == ("x", "y", "z", "value") + d.names = ('a', '', 'c', 'd') + assert d.names == ('a', '', 'c', 'd') d.names = ('a', 'b', 'c', 'd') assert d.names == ('a', 'b', 'c', 'd') exc = raises(ValueError, "d.names = ('a', 'b', 'c', 'c')") @@ -1000,6 +1002,14 @@ assert d.names == ('a', 'b', 'c', 'd') raises(KeyError, 'd["xyz"]') raises(KeyError, 'd.fields["xyz"]') + d = dtype([('', '<i8'), ('', '<f8')]) + assert d.descr == [('f0', '<i8'), ('f1', '<f8')] + d = dtype([('', '<i8'), ('b', '<f8')]) + assert d.descr == [('f0', '<i8'), ('b', '<f8')] + d = dtype([('a', '<i8'), ('', '<f8')]) + assert d.descr == [('a', '<i8'), ('f1', '<f8')] + exc = raises(ValueError, "dtype([('a', '<i8'), ('a', '<f8')])") + assert exc.value[0] == 'two fields with the same name' def test_create_from_dict(self): import numpy as np _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit