8000 Merge pull request #10435 from eric-wieser/duplicate-field-name-error · numpy/numpy@656c191 · GitHub
[go: up one dir, main page]

Skip to content

Commit 656c191

Browse files
authored
Merge pull request #10435 from eric-wieser/duplicate-field-name-error
MAINT: Use ValueError for duplicate field names in lookup (backport)
2 parents da42ade + 47c4f32 commit 656c191

File tree

5 files changed

+16
-42
lines changed

5 files changed

+16
-42
lines changed

numpy/core/include/numpy/npy_3kcompat.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ static NPY_INLINE int PyInt_Check(PyObject *op) {
9494
#define PyUString_InternFromString PyUnicode_InternFromString
9595
#define PyUString_Format PyUnicode_Format
9696

97+
#define PyBaseString_Check(obj) (PyUnicode_Check(obj))
98+
9799
#else
98100

99101
#define PyBytes_Type PyString_Type
@@ -123,6 +125,8 @@ static NPY_INLINE int PyInt_Check(PyObject *op) {
123125
#define PyUString_InternFromString PyString_InternFromString
124126
#define PyUString_Format PyString_Format
125127

128+
#define PyBaseString_Check(obj) (PyBytes_Check(obj) || PyUnicode_Check(obj))
129+
126130
#endif /* NPY_PY3K */
127131

128132

numpy/core/src/multiarray/descriptor.c

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -512,11 +512,7 @@ _convert_from_array_descr(PyObject *obj, int align)
512512
}
513513
if ((PyDict_GetItem(fields, name) != NULL)
514514
|| (title
515-
#if defined(NPY_PY3K)
516-
&& PyUString_Check(title)
517-
#else
518-
&& (PyUString_Check(title) || PyUnicode_Check(title))
519-
#endif
515+
&& PyBaseString_Check(title)
520516
&& (PyDict_GetItem(fields, title) != NULL))) {
521517
#if defined(NPY_PY3K)
522518
name = PyUnicode_AsUTF8String(name);
@@ -551,11 +547,7 @@ _convert_from_array_descr(PyObject *obj, int align)
551547
Py_INCREF(title);
552548
PyTuple_SET_ITEM(tup, 2, title);
553549
PyDict_SetItem(fields, name, tup);
554-
#if defined(NPY_PY3K)
555-
if (PyUString_Check(title)) {
556-
#else
557-
if (PyUString_Check(title) || PyUnicode_Check(title)) {
558-
#endif
550+
if (PyBaseString_Check(title)) {
559551
if (PyDict_GetItem(fields, title) != NULL) {
560552
PyErr_SetString(PyExc_ValueError,
561553
"title already used as a name or title.");
@@ -1181,11 +1173,7 @@ _convert_from_dict(PyObject *obj, int align)
11811173
Py_DECREF(tup);
11821174
goto fail;
11831175
}
1184-
#if defined(NPY_PY3K)
1185-
if (!PyUString_Check(name)) {
1186-
#else
1187-
if (!(PyUString_Check(name) || PyUnicode_Check(name))) {
1188-
#endif
1176+
if (!PyBaseString_Check(name)) {
11891177
PyErr_SetString(PyExc_ValueError,
11901178
"field names must be strings");
11911179
Py_DECREF(tup);
@@ -1202,11 +1190,7 @@ _convert_from_dict(PyObject *obj, int align)
12021190
PyDict_SetItem(fields, name, tup);
12031191
Py_DECREF(name);
12041192
if (len == 3) {
1205-
#if defined(NPY_PY3K)
1206-
if (PyUString_Check(title)) {
1207-
#else
1208-
if (PyUString_Check(title) || PyUnicode_Check(title)) {
1209-
#endif
1193+
if (PyBaseString_Check(title)) {
12101194
if (PyDict_GetItem(fields, title) != NULL) {
12111195 PyErr_SetString(PyExc_ValueError,
12121196
"title already used as a name or title.");
@@ -3821,11 +3805,7 @@ descr_subscript(PyArray_Descr *self, PyObject *op)
38213805
return NULL;
38223806
}
38233807

3824-
#if defined(NPY_PY3K)
3825-
if (PyUString_Check(op)) {
3826-
#else
3827-
if (PyUString_Check(op) || PyUnicode_Check(op)) {
3828-
#endif
3808+
if (PyBaseString_Check(op)) {
38293809
return _subscript_by_name(self, op);
38303810
}
38313811
else {

numpy/core/src/multiarray/mapping.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,11 +1396,7 @@ _get_field_view(PyArrayObject *arr, PyObject *ind, PyArrayObject **view)
13961396
*view = NULL;
13971397

13981398
/* first check for a single field name */
1399-
#if defined(NPY_PY3K)
1400-
if (PyUnicode_Check(ind)) {
1401-
#else
1402-
if (PyString_Check(ind) || PyUnicode_Check(ind)) {
1403-
#endif
1399+
if (PyBaseString_Check(ind)) {
14041400
PyObject *tup;
14051401
PyArray_Descr *fieldtype;
14061402
npy_intp offset;
@@ -1477,11 +1473,7 @@ _get_field_view(PyArrayObject *arr, PyObject *ind, PyArrayObject **view)
14771473
return -1;
14781474
}
14791475

1480-
#if defined(NPY_PY3K)
1481-
if (!PyUnicode_Check(name)) {
1482-
#else
1483-
if (!PyString_Check(name) && !PyUnicode_Check(name)) {
1484-
#endif
1476+
if (!PyBaseString_Check(name)) {
14851477
Py_DECREF(name);
14861478
Py_DECREF(fields);
14871479
Py_DECREF(names);
@@ -1521,7 +1513,7 @@ _get_field_view(PyArrayObject *arr, PyObject *ind, PyArrayObject **view)
15211513
PyObject *errmsg = PyUString_FromString(
15221514
"duplicate field of name ");
15231515
PyUString_ConcatAndDel(&errmsg, name);
1524-
PyErr_SetObject(PyExc_KeyError, errmsg);
1516+
PyErr_SetObject(PyExc_ValueError, errmsg);
15251517
Py_DECREF(errmsg);
15261518
Py_DECREF(fields);
15271519
Py_DECREF(names);

numpy/core/src/multiarray/scalartypes.c.src

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2376,11 +2376,7 @@ voidtype_ass_subscript(PyVoidScalarObject *self, PyObject *ind, PyObject *val)
23762376
return -1;
23772377
}
23782378

2379-
#if defined(NPY_PY3K)
2380-
if (PyUString_Check(ind)) {
2381-
#else
2382-
if (PyBytes_Check(ind) || PyUnicode_Check(ind)) {
2383-
#endif
2379+
if (PyBaseString_Check(ind)) {
23842380
/*
23852381
* Much like in voidtype_setfield, we cannot simply use ndarray's
23862382
* __setitem__ since assignment to void scalars should not broadcast

numpy/core/tests/test_multiarray.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1157,9 +1157,11 @@ def test_structuredscalar_indexing(self):
11571157
def test_multiindex_titles(self):
11581158
a = np.zeros(4, dtype=[(('a', 'b'), 'i'), ('c', 'i'), ('d', 'i')])
11591159
assert_raises(KeyError, lambda : a[['a','c']])
1160-
assert_raises(KeyError, lambda : a[['b','b']])
1160+
assert_raises(KeyError, lambda : a[['a','a']])
1161+
assert_raises(ValueError, lambda : a[['b','b']]) # field exists, but repeated
11611162
a[['b','c']] # no exception
11621163

1164+
11631165
class TestBool(object):
11641166
def test_test_interning(self):
11651167
a0 = np.bool_(0)

0 commit comments

Comments
 (0)
0