mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
GH-127381: pathlib ABCs: remove PathBase.rename() and replace() (#127658)
These methods are obviated by `PathBase.move()`, which can move directories and supports any `PathBase` object as a target.
This commit is contained in:
parent
e59caf67cd
commit
5b6635f772
3 changed files with 18 additions and 38 deletions
|
|
@ -14,7 +14,7 @@
|
|||
import functools
|
||||
import operator
|
||||
import posixpath
|
||||
from errno import EINVAL, EXDEV
|
||||
from errno import EINVAL
|
||||
from glob import _GlobberBase, _no_recurse_symlinks
|
||||
from stat import S_ISDIR, S_ISLNK, S_ISREG, S_ISSOCK, S_ISBLK, S_ISCHR, S_ISFIFO
|
||||
from pathlib._os import copyfileobj
|
||||
|
|
@ -902,45 +902,10 @@ def copy_into(self, target_dir, *, follow_symlinks=True,
|
|||
dirs_exist_ok=dirs_exist_ok,
|
||||
preserve_metadata=preserve_metadata)
|
||||
|
||||
def rename(self, target):
|
||||
"""
|
||||
Rename this path to the target path.
|
||||
|
||||
The target path may be absolute or relative. Relative paths are
|
||||
interpreted relative to the current working directory, *not* the
|
||||
directory of the Path object.
|
||||
|
||||
Returns the new Path instance pointing to the target path.
|
||||
"""
|
||||
raise UnsupportedOperation(self._unsupported_msg('rename()'))
|
||||
|
||||
def replace(self, target):
|
||||
"""
|
||||
Rename this path to the target path, overwriting if that path exists.
|
||||
|
||||
The target path may be absolute or relative. Relative paths are
|
||||
interpreted relative to the current working directory, *not* the
|
||||
directory of the Path object.
|
||||
|
||||
Returns the new Path instance pointing to the target path.
|
||||
"""
|
||||
raise UnsupportedOperation(self._unsupported_msg('replace()'))
|
||||
|
||||
def move(self, target):
|
||||
"""
|
||||
Recursively move this file or directory tree to the given destination.
|
||||
"""
|
||||
self._ensure_different_file(target)
|
||||
try:
|
||||
return self.replace(target)
|
||||
except UnsupportedOperation:
|
||||
pass
|
||||
except TypeError:
|
||||
if not isinstance(target, PathBase):
|
||||
raise
|
||||
except OSError as err:
|
||||
if err.errno != EXDEV:
|
||||
raise
|
||||
target = self.copy(target, follow_symlinks=False, preserve_metadata=True)
|
||||
self._delete()
|
||||
return target
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
import os
|
||||
import posixpath
|
||||
import sys
|
||||
from errno import EXDEV
|
||||
from glob import _StringGlobber
|
||||
from itertools import chain
|
||||
from _collections_abc import Sequence
|
||||
|
|
@ -876,6 +877,22 @@ def replace(self, target):
|
|||
os.replace(self, target)
|
||||
return self.with_segments(target)
|
||||
|
||||
def move(self, target):
|
||||
"""
|
||||
Recursively move this file or directory tree to the given destination.
|
||||
"""
|
||||
self._ensure_different_file(target)
|
||||
try:
|
||||
return self.replace(target)
|
||||
except TypeError:
|
||||
if not isinstance(target, PathBase):
|
||||
raise
|
||||
except OSError as err:
|
||||
if err.errno != EXDEV:
|
||||
raise
|
||||
# Fall back to copy+delete.
|
||||
return PathBase.move(self, target)
|
||||
|
||||
if hasattr(os, "symlink"):
|
||||
def symlink_to(self, target, target_is_directory=False):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -1376,8 +1376,6 @@ def test_unsupported_operation(self):
|
|||
self.assertRaises(e, p.hardlink_to, 'foo')
|
||||
self.assertRaises(e, p.mkdir)
|
||||
self.assertRaises(e, p.touch)
|
||||
self.assertRaises(e, p.rename, 'foo')
|
||||
self.assertRaises(e, p.replace, 'foo')
|
||||
self.assertRaises(e, p.chmod, 0o755)
|
||||
self.assertRaises(e, p.lchmod, 0o755)
|
||||
self.assertRaises(e, p.unlink)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue