diff --git a/pep-0519.txt b/pep-0519.txt index b23284ac9..bd303fa5d 100644 --- a/pep-0519.txt +++ b/pep-0519.txt @@ -149,7 +149,10 @@ The ``fspath()`` function will be added with the following semantics:: def fspath(path: t.Union[PathLike, str, bytes]) -> t.Union[str, bytes]: """Return the string representation of the path. - If str or bytes is passed in, it is returned unchanged. + If str or bytes is passed in, it is returned unchanged. If __fspath__() + returns something other than str or bytes then TypeError is raised. If + this function is given something that is not str, bytes, or os.PathLike + then TypeError is raised. """ if isinstance(path, (str, bytes)): return path @@ -158,13 +161,19 @@ The ``fspath()`` function will be added with the following semantics:: # methods. path_type = type(path) try: - return path_type.__fspath__(path) + path = path_type.__fspath__(path) except AttributeError: if hasattr(path_type, '__fspath__'): raise + else: + if isinstance(path, (str, bytes)): + return path + else: + raise TypeError("expected __fspath__() to return str or bytes, " + "not " + type(path).__name__) - raise TypeError("expected str, bytes or os.PathLike object, not " - + path_type.__name__) + raise TypeError("expected str, bytes or os.PathLike object, not " + + path_type.__name__) The ``os.fsencode()`` [#os-fsencode]_ and ``os.fsdecode()`` [#os-fsdecode]_ functions will be updated to accept @@ -294,6 +303,14 @@ The C API will gain an equivalent function to ``os.fspath()``:: path_repr = PyObject_CallFunctionObjArgs(func, NULL); Py_DECREF(func); + if (!PyUnicode_Check(path_repr) && !PyBytes_Check(path_repr)) { + Py_DECREF(path_repr); + return PyErr_Format(PyExc_TypeError, + "expected __fspath__() to return str or bytes, " + "not %S", + path_repr->ob_type); + } + return path_repr; }