bpo-33123: pathlib: Add missing_ok parameter to Path.unlink (GH-6191)
Similarly to how several pathlib file creation functions have an "exists_ok" parameter, we should introduce "missing_ok" that makes removal functions not raise an exception when a file or directory is already absent. IMHO, this should cover Path.unlink and Path.rmdir. Note, Path.resolve() has a "strict" parameter since 3.6 that does the same thing. Naming this of this new parameter tries to be consistent with the "exists_ok" parameter as that is more explicit about what it does (as opposed to "strict"). https://bugs.python.org/issue33123
This commit is contained in:
parent
1a2dd82f56
commit
d9e006bcef
|
@ -1048,11 +1048,20 @@ call fails (for example because the path doesn't exist).
|
||||||
otherwise :exc:`FileExistsError` is raised.
|
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,
|
Remove this file or symbolic link. If the path points to a directory,
|
||||||
use :func:`Path.rmdir` instead.
|
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.link_to(target)
|
.. method:: Path.link_to(target)
|
||||||
|
|
||||||
|
|
|
@ -1279,14 +1279,18 @@ class Path(PurePath):
|
||||||
self._raise_closed()
|
self._raise_closed()
|
||||||
self._accessor.lchmod(self, mode)
|
self._accessor.lchmod(self, mode)
|
||||||
|
|
||||||
def unlink(self):
|
def unlink(self, missing_ok=False):
|
||||||
"""
|
"""
|
||||||
Remove this file or link.
|
Remove this file or link.
|
||||||
If the path is a directory, use rmdir() instead.
|
If the path is a directory, use rmdir() instead.
|
||||||
"""
|
"""
|
||||||
if self._closed:
|
if self._closed:
|
||||||
self._raise_closed()
|
self._raise_closed()
|
||||||
self._accessor.unlink(self)
|
try:
|
||||||
|
self._accessor.unlink(self)
|
||||||
|
except FileNotFoundError:
|
||||||
|
if not missing_ok:
|
||||||
|
raise
|
||||||
|
|
||||||
def rmdir(self):
|
def rmdir(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1635,6 +1635,11 @@ class _BasePathTest(object):
|
||||||
self.assertFileNotFound(p.stat)
|
self.assertFileNotFound(p.stat)
|
||||||
self.assertFileNotFound(p.unlink)
|
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):
|
def test_rmdir(self):
|
||||||
p = self.cls(BASE) / 'dirA'
|
p = self.cls(BASE) / 'dirA'
|
||||||
for q in p.iterdir():
|
for q in p.iterdir():
|
||||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue