summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2023-10-01 15:14:02 (GMT)
committerGitHub <noreply@github.com>2023-10-01 15:14:02 (GMT)
commit15de493395c3251b8b82063bbe22a379792b9404 (patch)
tree15ab6a3a86eb413ea6c2c708dda48e4384f07f16 /Doc
parent06faa9a39bd93c5e7999d52b52043ecdd0774dac (diff)
downloadcpython-15de493395c3251b8b82063bbe22a379792b9404.zip
cpython-15de493395c3251b8b82063bbe22a379792b9404.tar.gz
cpython-15de493395c3251b8b82063bbe22a379792b9404.tar.bz2
GH-107465: Add `pathlib.Path.from_uri()` classmethod. (#107640)
This method supports file URIs (including variants) as described in RFC 8089, such as URIs generated by `pathlib.Path.as_uri()` and `urllib.request.pathname2url()`. The method is added to `Path` rather than `PurePath` because it uses `os.fsdecode()`, and so its results vary from system to system. I intend to deprecate `PurePath.as_uri()` and move it to `Path` for the same reason. Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Diffstat (limited to 'Doc')
-rw-r--r--Doc/library/pathlib.rst36
-rw-r--r--Doc/whatsnew/3.13.rst4
2 files changed, 40 insertions, 0 deletions
diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst
index 48d6176..8ee89a0 100644
--- a/Doc/library/pathlib.rst
+++ b/Doc/library/pathlib.rst
@@ -850,6 +850,42 @@ call fails (for example because the path doesn't exist).
.. versionadded:: 3.5
+.. classmethod:: Path.from_uri(uri)
+
+ Return a new path object from parsing a 'file' URI conforming to
+ :rfc:`8089`. For example::
+
+ >>> p = Path.from_uri('file:///etc/hosts')
+ PosixPath('/etc/hosts')
+
+ On Windows, DOS device and UNC paths may be parsed from URIs::
+
+ >>> p = Path.from_uri('file:///c:/windows')
+ WindowsPath('c:/windows')
+ >>> p = Path.from_uri('file://server/share')
+ WindowsPath('//server/share')
+
+ Several variant forms are supported::
+
+ >>> p = Path.from_uri('file:////server/share')
+ WindowsPath('//server/share')
+ >>> p = Path.from_uri('file://///server/share')
+ WindowsPath('//server/share')
+ >>> p = Path.from_uri('file:c:/windows')
+ WindowsPath('c:/windows')
+ >>> p = Path.from_uri('file:/c|/windows')
+ WindowsPath('c:/windows')
+
+ :exc:`ValueError` is raised if the URI does not start with ``file:``, or
+ the parsed path isn't absolute.
+
+ :func:`os.fsdecode` is used to decode percent-escaped byte sequences, and
+ so file URIs are not portable across machines with different
+ :ref:`filesystem encodings <filesystem-encoding>`.
+
+ .. versionadded:: 3.13
+
+
.. method:: Path.stat(*, follow_symlinks=True)
Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`.
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index a789084..1de5479 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -184,6 +184,10 @@ pathlib
:exc:`NotImplementedError` when a path operation isn't supported.
(Contributed by Barney Gale in :gh:`89812`.)
+* Add :meth:`pathlib.Path.from_uri`, a new constructor to create a :class:`pathlib.Path`
+ object from a 'file' URI (``file:/``).
+ (Contributed by Barney Gale in :gh:`107465`.)
+
* Add support for recursive wildcards in :meth:`pathlib.PurePath.match`.
(Contributed by Barney Gale in :gh:`73435`.)