bpo-35942: Improve the error message if __fspath__ returns invalid types in path_converter (GH-11831)

The error message emitted when returning invalid types from __fspath__ in interfaces that allow passing PathLike objects has been improved and now it does explain the origin of the error.
This commit is contained in:
Pablo Galindo 2019-02-18 10:46:34 +00:00 committed by GitHub
parent ac28147e78
commit 09fbcd6085
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 36 additions and 9 deletions

View file

@ -954,28 +954,35 @@ path_converter(PyObject *o, void *p)
if (!is_index && !is_buffer && !is_unicode && !is_bytes) {
/* Inline PyOS_FSPath() for better error messages. */
_Py_IDENTIFIER(__fspath__);
PyObject *func = NULL;
PyObject *func, *res;
func = _PyObject_LookupSpecial(o, &PyId___fspath__);
if (NULL == func) {
goto error_format;
}
/* still owns a reference to the original object */
Py_DECREF(o);
o = _PyObject_CallNoArg(func);
res = _PyObject_CallNoArg(func);
Py_DECREF(func);
if (NULL == o) {
if (NULL == res) {
goto error_exit;
}
else if (PyUnicode_Check(o)) {
else if (PyUnicode_Check(res)) {
is_unicode = 1;
}
else if (PyBytes_Check(o)) {
else if (PyBytes_Check(res)) {
is_bytes = 1;
}
else {
goto error_format;
PyErr_Format(PyExc_TypeError,
"expected %.200s.__fspath__() to return str or bytes, "
"not %.200s", Py_TYPE(o)->tp_name,
Py_TYPE(res)->tp_name);
Py_DECREF(res);
goto error_exit;
}
/* still owns a reference to the original object */
Py_DECREF(o);
o = res;
}
if (is_unicode) {