diff options
author | aiudirog <aiudirog@gmail.com> | 2019-08-08 05:41:10 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2019-08-08 05:41:10 (GMT) |
commit | 4c69be22df3852f17873a74d015528d9a8ae92d6 (patch) | |
tree | d0f30d3f81f17f85594408e9e5705a678c98f851 | |
parent | 0378d98678f3617fd44d9a6266e7c17ebce62755 (diff) | |
download | cpython-4c69be22df3852f17873a74d015528d9a8ae92d6.zip cpython-4c69be22df3852f17873a74d015528d9a8ae92d6.tar.gz cpython-4c69be22df3852f17873a74d015528d9a8ae92d6.tar.bz2 |
bpo-34775: Return NotImplemented in PurePath division. (GH-9509)
-rw-r--r-- | Lib/pathlib.py | 10 | ||||
-rw-r--r-- | Lib/test/test_pathlib.py | 41 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-09-23-03-18-52.bpo-34775.vHeuHk.rst | 3 |
3 files changed, 52 insertions, 2 deletions
diff --git a/Lib/pathlib.py b/Lib/pathlib.py index 6369c4b..6355ae8 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -907,10 +907,16 @@ class PurePath(object): return self._make_child(args) def __truediv__(self, key): - return self._make_child((key,)) + try: + return self._make_child((key,)) + except TypeError: + return NotImplemented def __rtruediv__(self, key): - return self._from_parts([key] + self._parts) + try: + return self._from_parts([key] + self._parts) + except TypeError: + return NotImplemented @property def parent(self): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 069467a..f74524d 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -2329,5 +2329,46 @@ class WindowsPathTest(_BasePathTest, unittest.TestCase): check() +class CompatiblePathTest(unittest.TestCase): + """ + Test that a type can be made compatible with PurePath + derivatives by implementing division operator overloads. + """ + + class CompatPath: + """ + Minimum viable class to test PurePath compatibility. + Simply uses the division operator to join a given + string and the string value of another object with + a forward slash. + """ + def __init__(self, string): + self.string = string + + def __truediv__(self, other): + return type(self)(f"{self.string}/{other}") + + def __rtruediv__(self, other): + return type(self)(f"{other}/{self.string}") + + def test_truediv(self): + result = pathlib.PurePath("test") / self.CompatPath("right") + self.assertIsInstance(result, self.CompatPath) + self.assertEqual(result.string, "test/right") + + with self.assertRaises(TypeError): + # Verify improper operations still raise a TypeError + pathlib.PurePath("test") / 10 + + def test_rtruediv(self): + result = self.CompatPath("left") / pathlib.PurePath("test") + self.assertIsInstance(result, self.CompatPath) + self.assertEqual(result.string, "left/test") + + with self.assertRaises(TypeError): + # Verify improper operations still raise a TypeError + 10 / pathlib.PurePath("test") + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2018-09-23-03-18-52.bpo-34775.vHeuHk.rst b/Misc/NEWS.d/next/Library/2018-09-23-03-18-52.bpo-34775.vHeuHk.rst new file mode 100644 index 0000000..f99bf5b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-23-03-18-52.bpo-34775.vHeuHk.rst @@ -0,0 +1,3 @@ +Division handling of PurePath now returns NotImplemented instead of raising +a TypeError when passed something other than an instance of str or PurePath. +Patch by Roger Aiudi. |