Issue #19775: Add a samefile() method to pathlib Path objects.

Initial patch by Vajrasky Kok.
This commit is contained in:
Antoine Pitrou 2014-05-13 10:50:15 +02:00
parent 38acd4c028
commit 43e3d9409d
4 changed files with 53 additions and 0 deletions

View File

@ -884,6 +884,25 @@ call fails (for example because the path doesn't exist):
Remove this directory. The directory must be empty.
.. method:: Path.samefile(other_path)
Return whether this path points to the same file as *other_path*, which
can be either a Path object, or a string. The semantics are similar
to :func:`os.path.samefile` and :func:`os.path.samestat`.
An :exc:`OSError` can be raised if either file cannot be accessed for some
reason.
>>> p = Path('spam')
>>> q = Path('eggs')
>>> p.samefile(q)
False
>>> p.samefile('spam')
True
.. versionadded:: 3.5
.. method:: Path.symlink_to(target, target_is_directory=False)
Make this path a symbolic link to *target*. Under Windows,

View File

@ -961,6 +961,17 @@ class Path(PurePath):
"""
return cls(os.getcwd())
def samefile(self, other_path):
"""Return whether `other_file` is the same or not as this file.
(as returned by os.path.samefile(file, other_file)).
"""
st = self.stat()
try:
other_st = other_path.stat()
except AttributeError:
other_st = os.stat(other_path)
return os.path.samestat(st, other_st)
def iterdir(self):
"""Iterate over the files in this directory. Does not yield any
result for the special paths '.' and '..'.

View File

@ -1251,6 +1251,26 @@ class _BasePathTest(object):
p = self.cls.cwd()
self._test_cwd(p)
def test_samefile(self):
fileA_path = os.path.join(BASE, 'fileA')
fileB_path = os.path.join(BASE, 'dirB', 'fileB')
p = self.cls(fileA_path)
pp = self.cls(fileA_path)
q = self.cls(fileB_path)
self.assertTrue(p.samefile(fileA_path))
self.assertTrue(p.samefile(pp))
self.assertFalse(p.samefile(fileB_path))
self.assertFalse(p.samefile(q))
# Test the non-existent file case
non_existent = os.path.join(BASE, 'foo')
r = self.cls(non_existent)
self.assertRaises(FileNotFoundError, p.samefile, r)
self.assertRaises(FileNotFoundError, p.samefile, non_existent)
self.assertRaises(FileNotFoundError, r.samefile, p)
self.assertRaises(FileNotFoundError, r.samefile, non_existent)
self.assertRaises(FileNotFoundError, r.samefile, r)
self.assertRaises(FileNotFoundError, r.samefile, non_existent)
def test_empty_path(self):
# The empty path points to '.'
p = self.cls('')

View File

@ -84,6 +84,9 @@ Core and Builtins
Library
-------
- Issue #19775: Add a samefile() method to pathlib Path objects. Initial
patch by Vajrasky Kok.
- Issue #21398: Fix an unicode error in the pydoc pager when the documentation
contains characters not encodable to the stdout encoding.