diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 3d28a1bea30315..1ba6eb0db6dfa1 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -1033,11 +1033,20 @@ call fails (for example because the path doesn't exist): otherwise :exc:`FileExistsError` is raised. -.. method:: Path.unlink() +.. method:: Path.unlink(missing_ok=False) Remove this file or symbolic link. If the path points to a directory, use :func:`Path.rmdir` instead. + If *missing_ok* is false (the default), :exc:`FileNotFoundError` is + raised if the path does not exist. + + If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be + ignored (same behavior as the POSIX ``rm -f`` command). + + .. versionchanged:: 3.8 + The *missing_ok* parameter was added. + .. method:: Path.write_bytes(data) diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 8431c29c1d6516..f42f63ab76ba5a 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -1256,14 +1256,18 @@ def lchmod(self, mode): self._raise_closed() self._accessor.lchmod(self, mode) - def unlink(self): + def unlink(self, missing_ok=False): """ Remove this file or link. If the path is a directory, use rmdir() instead. """ if self._closed: self._raise_closed() - self._accessor.unlink(self) + try: + self._accessor.unlink(self) + except FileNotFoundError: + if not missing_ok: + raise def rmdir(self): """ diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 53215550b4354e..b0804f07ab0ad5 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1627,6 +1627,11 @@ def test_unlink(self): self.assertFileNotFound(p.stat) self.assertFileNotFound(p.unlink) + def test_unlink_missing_ok(self): + p = self.cls(BASE) / 'fileAAA' + self.assertFileNotFound(p.unlink) + p.unlink(missing_ok=True) + def test_rmdir(self): p = self.cls(BASE) / 'dirA' for q in p.iterdir(): diff --git a/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst b/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst new file mode 100644 index 00000000000000..8803ca84313122 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-22-19-13-19.bpo-33123._Y5ooE.rst @@ -0,0 +1,2 @@ +:class:`pathlib.Path.unlink` now accepts a *missing_ok* parameter to avoid a +:exc:`FileNotFoundError` from being raised. Patch by Robert Buchholz.