diff options
author | Mark Wiebe <mwwiebe@gmail.com> | 2011-07-11 14:44:24 -0500 |
---|---|---|
committer | Mark Wiebe <mwiebe@enthought.com> | 2011-07-19 14:00:26 -0500 |
commit | 84ee545993c55d915d55750f576c20ed1fe028fb (patch) | |
tree | cd53d9d0d908af4e0e8599227a1ee4ca91ed1e94 | |
parent | c649139121015e3d6bb82377e3c9094a0f850065 (diff) | |
download | numpy-84ee545993c55d915d55750f576c20ed1fe028fb.tar.gz |
ENH: core: Improve casting failure message produced by PyArray_FromArray
-rw-r--r-- | numpy/core/src/multiarray/ctors.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c index 6100fe7ee..a843aa114 100644 --- a/numpy/core/src/multiarray/ctors.c +++ b/numpy/core/src/multiarray/ctors.c @@ -1976,6 +1976,7 @@ PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags) PyArray_Descr *oldtype; char *msg = "cannot copy back to a read-only array"; PyTypeObject *subtype; + NPY_CASTING casting = NPY_SAFE_CASTING; oldtype = PyArray_DESCR(arr); subtype = Py_TYPE(arr); @@ -1992,16 +1993,28 @@ PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags) itemsize = newtype->elsize; } - /* - * Can't cast unless ndim-0 array, NPY_ARRAY_FORCECAST is specified - * or the cast is safe. - */ - if (!(flags & NPY_ARRAY_FORCECAST) && !PyArray_NDIM(arr) == 0 && - !PyArray_CanCastTo(oldtype, newtype)) { + /* If the casting if forced, use the 'unsafe' casting rule */ + if (flags & NPY_ARRAY_FORCECAST) { + casting = NPY_UNSAFE_CASTING; + } + + /* Raise an error if the casting rule isn't followed */ + if (!PyArray_CanCastArrayTo(arr, newtype, casting)) { + PyObject *errmsg; + + errmsg = PyUString_FromString("Cannot cast array data from "); + PyUString_ConcatAndDel(&errmsg, + PyObject_Repr((PyObject *)PyArray_DESCR(arr))); + PyUString_ConcatAndDel(&errmsg, + PyUString_FromString(" to ")); + PyUString_ConcatAndDel(&errmsg, + PyObject_Repr((PyObject *)newtype)); + PyUString_ConcatAndDel(&errmsg, + PyUString_FromFormat(" according to the rule %s", + npy_casting_to_string(casting))); + PyErr_SetObject(PyExc_TypeError, errmsg); + Py_DECREF(newtype); - PyErr_SetString(PyExc_TypeError, - "array cannot be safely cast " \ - "to required type"); return NULL; } @@ -2013,14 +2026,15 @@ PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags) flags |= NPY_ARRAY_C_CONTIGUOUS; } copy = (flags & NPY_ARRAY_ENSURECOPY) || - ((flags & NPY_ARRAY_C_CONTIGUOUS) && (!(arrflags & NPY_ARRAY_C_CONTIGUOUS))) + ((flags & NPY_ARRAY_C_CONTIGUOUS) && + (!(arrflags & NPY_ARRAY_C_CONTIGUOUS))) || ((flags & NPY_ARRAY_ALIGNED) && - (!(arrflags & NPY_ARRAY_ALIGNED))) + (!(arrflags & NPY_ARRAY_ALIGNED))) || (arr->nd > 1 && - ((flags & NPY_ARRAY_F_CONTIGUOUS) && - (!(arrflags & NPY_ARRAY_F_CONTIGUOUS)))) + ((flags & NPY_ARRAY_F_CONTIGUOUS) && + (!(arrflags & NPY_ARRAY_F_CONTIGUOUS)))) || ((flags & NPY_ARRAY_WRITEABLE) && - (!(arrflags & NPY_ARRAY_WRITEABLE))); + (!(arrflags & NPY_ARRAY_WRITEABLE))); if (copy) { if ((flags & NPY_ARRAY_UPDATEIFCOPY) && |