Skip to content
Permalink
Browse files

bpo-31163: Added return values to pathlib.Path instance's rename and …

…replace methods. (GH-13582) (GH-15944)

* bpo-31163: Added return values to pathlib.Path instance's rename and replace methods.
(cherry picked from commit 088a09a)

Co-authored-by: hui shang <shangdahao@gmail.com>
  • Loading branch information...
2 people authored and jaraco committed Sep 11, 2019
1 parent 4d2babd commit cbd7b2a399a8ff2ed9994c380b07ef598892b6b1
@@ -933,23 +933,32 @@ call fails (for example because the path doesn't exist).

.. method:: Path.rename(target)

Rename this file or directory to the given *target*. On Unix, if
*target* exists and is a file, it will be replaced silently if the user
has permission. *target* can be either a string or another path object::
Rename this file or directory to the given *target*, and return a new Path
instance pointing to *target*. On Unix, if *target* exists and is a file,
it will be replaced silently if the user has permission. *target* can be
either a string or another path object::

>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
PosixPath('bar')
>>> target.open().read()
'some text'

.. versionchanged:: 3.8
Added return value, return the new Path instance.


.. method:: Path.replace(target)

Rename this file or directory to the given *target*. If *target* points
to an existing file or directory, it will be unconditionally replaced.
Rename this file or directory to the given *target*, and return a new Path
instance pointing to *target*. If *target* points to an existing file or
directory, it will be unconditionally replaced.

.. versionchanged:: 3.8
Added return value, return the new Path instance.


.. method:: Path.resolve(strict=False)
@@ -1332,20 +1332,24 @@ def link_to(self, target):

def rename(self, target):
"""
Rename this path to the given path.
Rename this path to the given path,
and return a new Path instance pointing to the given path.
"""
if self._closed:
self._raise_closed()
self._accessor.rename(self, target)
return self.__class__(target)

def replace(self, target):
"""
Rename this path to the given path, clobbering the existing
destination if it exists.
destination if it exists, and return a new Path instance
pointing to the given path.
"""
if self._closed:
self._raise_closed()
self._accessor.replace(self, target)
return self.__class__(target)

def symlink_to(self, target, target_is_directory=False):
"""
@@ -1680,12 +1680,14 @@ def test_rename(self):
size = p.stat().st_size
# Renaming to another path.
q = P / 'dirA' / 'fileAA'
p.rename(q)
renamed_p = p.rename(q)
self.assertEqual(renamed_p, q)
self.assertEqual(q.stat().st_size, size)
self.assertFileNotFound(p.stat)
# Renaming to a str of a relative path.
r = rel_join('fileAAA')
q.rename(r)
renamed_q = q.rename(r)
self.assertEqual(renamed_q, self.cls(r))
self.assertEqual(os.stat(r).st_size, size)
self.assertFileNotFound(q.stat)

@@ -1695,12 +1697,14 @@ def test_replace(self):
size = p.stat().st_size
# Replacing a non-existing path.
q = P / 'dirA' / 'fileAA'
p.replace(q)
replaced_p = p.replace(q)
self.assertEqual(replaced_p, q)
self.assertEqual(q.stat().st_size, size)
self.assertFileNotFound(p.stat)
# Replacing another (existing) path.
r = rel_join('dirB', 'fileB')
q.replace(r)
replaced_q = q.replace(r)
self.assertEqual(replaced_q, self.cls(r))
self.assertEqual(os.stat(r).st_size, size)
self.assertFileNotFound(q.stat)

@@ -0,0 +1,2 @@
pathlib.Path instance's rename and replace methods now return the new Path
instance.

0 comments on commit cbd7b2a

Please sign in to comment.
You can’t perform that action at this time.