Skip to content

Commit

Permalink
bpo-34775: Return NotImplemented in PurePath division. (GH-9509) (GH-…
Browse files Browse the repository at this point in the history
…15172)

(cherry picked from commit 4c69be2)

Co-authored-by: aiudirog <aiudirog@gmail.com>
  • Loading branch information
2 people authored and ned-deily committed Aug 29, 2019
1 parent e471a54 commit 4adcaf8
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
10 changes: 8 additions & 2 deletions Lib/pathlib.py
Expand Up @@ -907,10 +907,16 @@ def joinpath(self, *args):
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):
Expand Down
41 changes: 41 additions & 0 deletions Lib/test/test_pathlib.py
Expand Up @@ -2329,5 +2329,46 @@ def check():
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()
@@ -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.

0 comments on commit 4adcaf8

Please sign in to comment.