diff -r 00991aa5fdb5 Lib/test/test_os.py --- a/Lib/test/test_os.py Sat Jun 04 10:19:27 2016 -0700 +++ b/Lib/test/test_os.py Sat Jun 04 12:39:52 2016 -0700 @@ -2824,11 +2824,13 @@ def setUp(self): self.path = os.path.realpath(support.TESTFN) + self.bytes_path = self.path.encode('ascii') self.addCleanup(support.rmtree, self.path) os.mkdir(self.path) def create_file(self, name="file.txt"): - filename = os.path.join(self.path, name) + path = self.bytes_path if isinstance(name, bytes) else self.path + filename = os.path.join(path, name) create_file(filename, b'python') return filename @@ -2917,15 +2919,16 @@ self.check_entry(entry, 'symlink_file.txt', False, True, True) def get_entry(self, name): - entries = list(os.scandir(self.path)) + path = self.bytes_path if isinstance(name, bytes) else self.path + entries = list(os.scandir(path)) self.assertEqual(len(entries), 1) entry = entries[0] self.assertEqual(entry.name, name) return entry - def create_file_entry(self): - filename = self.create_file() + def create_file_entry(self, name='file.txt'): + filename = self.create_file(name=name) return self.get_entry(os.path.basename(filename)) def test_current_directory(self): @@ -2946,6 +2949,17 @@ entry = self.create_file_entry() self.assertEqual(repr(entry), "") + def test_fspath_protocol(self): + entry = self.create_file_entry() + self.assertEqual(os.fspath(entry), os.path.join(self.path, 'file.txt')) + + def test_fspath_protocol_bytes(self): + bytes_filename = b'bytesfile.txt' + bytes_entry = self.create_file_entry(name=bytes_filename) + fspath = os.fspath(bytes_entry) + self.assertIsInstance(fspath, bytes) + self.assertEqual(fspath, os.path.join(self.path.encode('ascii'), bytes_filename)) + def test_removed_dir(self): path = os.path.join(self.path, 'dir') diff -r 00991aa5fdb5 Modules/posixmodule.c --- a/Modules/posixmodule.c Sat Jun 04 10:19:27 2016 -0700 +++ b/Modules/posixmodule.c Sat Jun 04 12:39:52 2016 -0700 @@ -11718,6 +11718,13 @@ return PyUnicode_FromFormat("", self->name); } +static PyObject * +DirEntry_fspath(DirEntry * self) +{ + Py_INCREF(self->path); + return self->path; +} + static PyMemberDef DirEntry_members[] = { {"name", T_OBJECT_EX, offsetof(DirEntry, name), READONLY, "the entry's base filename, relative to scandir() \"path\" argument"}, @@ -11742,6 +11749,9 @@ {"inode", (PyCFunction)DirEntry_inode, METH_NOARGS, "return inode of the entry; cached per entry", }, + {"__fspath__", (PyCFunction)DirEntry_fspath, METH_NOARGS, + "returns the path for the entry", + }, {NULL} };