https://github.com/python/cpython/commit/14f1ca7d5363386163839b31ce987423daecc3de
commit: 14f1ca7d5363386163839b31ce987423daecc3de
branch: main
author: Nice Zombies <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-03-28T21:20:08Z
summary:
gh-117335: Handle non-iterables for `ntpath.commonpath` (GH-117336)
files:
A Misc/NEWS.d/next/Core and
Builtins/2024-03-28-19-13-20.gh-issue-117335.d6uKJu.rst
M Lib/ntpath.py
M Lib/test/test_ntpath.py
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index f1c48ecd1e5e2a..ecfc7d48dbb192 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -831,23 +831,22 @@ def relpath(path, start=None):
raise
-# Return the longest common sub-path of the sequence of paths given as input.
+# Return the longest common sub-path of the iterable of paths given as input.
# The function is case-insensitive and 'separator-insensitive', i.e. if the
# only difference between two paths is the use of '\' versus '/' as separator,
# they are deemed to be equal.
#
# However, the returned path will have the standard '\' separator (even if the
# given paths had the alternative '/' separator) and will have the case of the
-# first path given in the sequence. Additionally, any trailing separator is
+# first path given in the iterable. Additionally, any trailing separator is
# stripped from the returned path.
def commonpath(paths):
- """Given a sequence of path names, returns the longest common sub-path."""
-
+ """Given an iterable of path names, returns the longest common sub-path."""
+ paths = tuple(map(os.fspath, paths))
if not paths:
- raise ValueError('commonpath() arg is an empty sequence')
+ raise ValueError('commonpath() arg is an empty iterable')
- paths = tuple(map(os.fspath, paths))
if isinstance(paths[0], bytes):
sep = b'\\'
altsep = b'/'
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index 9cb03e3cd5de8d..c816f99e7e9f1b 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -871,11 +871,14 @@ def check_error(exc, paths):
self.assertRaises(exc, ntpath.commonpath,
[os.fsencode(p) for p in paths])
+ self.assertRaises(TypeError, ntpath.commonpath, None)
self.assertRaises(ValueError, ntpath.commonpath, [])
+ self.assertRaises(ValueError, ntpath.commonpath, iter([]))
check_error(ValueError, ['C:\\Program Files', 'Program Files'])
check_error(ValueError, ['C:\\Program Files', 'C:Program Files'])
check_error(ValueError, ['\\Program Files', 'Program Files'])
check_error(ValueError, ['Program Files', 'C:\\Program Files'])
+
check(['C:\\Program Files'], 'C:\\Program Files')
check(['C:\\Program Files', 'C:\\Program Files'], 'C:\\Program Files')
check(['C:\\Program Files\\', 'C:\\Program Files'],
diff --git a/Misc/NEWS.d/next/Core and
Builtins/2024-03-28-19-13-20.gh-issue-117335.d6uKJu.rst b/Misc/NEWS.d/next/Core
and Builtins/2024-03-28-19-13-20.gh-issue-117335.d6uKJu.rst
new file mode 100644
index 00000000000000..e419b2e97f3886
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and
Builtins/2024-03-28-19-13-20.gh-issue-117335.d6uKJu.rst
@@ -0,0 +1 @@
+Raise TypeError for non-sequences for :func:`ntpath.commonpath`.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]