From: Bar Harel Date: Sun, 22 Dec 2019 09:57:27 +0000 (+0200) Subject: bpo-38878: Fix os.PathLike __subclasshook__ (GH-17336) X-Git-Tag: v3.9.0a3~202 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=eae87e3e4e0cb9a0ce10c2e101acb6995d79e09c;p=thirdparty%2FPython%2Fcpython.git bpo-38878: Fix os.PathLike __subclasshook__ (GH-17336) Quick subclasshook fix using the same method is being used in collections.abc (up to a certain degree). --- diff --git a/Lib/os.py b/Lib/os.py index c901bd1b8ed9..ca418edbc573 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -26,6 +26,8 @@ import abc import sys import stat as st +from _collections_abc import _check_methods + _names = sys.builtin_module_names # Note: more names are added to __all__ later. @@ -1070,7 +1072,9 @@ class PathLike(abc.ABC): @classmethod def __subclasshook__(cls, subclass): - return hasattr(subclass, '__fspath__') + if cls is PathLike: + return _check_methods(subclass, '__fspath__') + return NotImplemented def __class_getitem__(cls, type): return cls diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index f44ddbad7d64..82c441c20483 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -4048,6 +4048,14 @@ class TestPEP519(unittest.TestCase): self.assertRaises(ZeroDivisionError, self.fspath, FakePath(ZeroDivisionError())) + def test_pathlike_subclasshook(self): + # bpo-38878: subclasshook causes subclass checks + # true on abstract implementation. + class A(os.PathLike): + pass + self.assertFalse(issubclass(FakePath, A)) + self.assertTrue(issubclass(FakePath, os.PathLike)) + def test_pathlike_class_getitem(self): self.assertIs(os.PathLike[bytes], os.PathLike) diff --git a/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst b/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst new file mode 100644 index 000000000000..9cbdf08dd53e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-22-12-08-52.bpo-38878.EJ0cFf.rst @@ -0,0 +1,2 @@ +Fixed __subclasshook__ of :class:`os.PathLike` to return a correct result +upon inheritence. Patch by Bar Harel.