.. function:: commonpath(paths)
- Return the longest common sub-path of each pathname in the sequence
+ Return the longest common sub-path of each pathname in the iterable
*paths*. Raise :exc:`ValueError` if *paths* contain both absolute
and relative pathnames, the *paths* are on the different drives or
if *paths* is empty. Unlike :func:`commonprefix`, this returns a
.. versionadded:: 3.5
.. versionchanged:: 3.6
- Accepts a sequence of :term:`path-like objects <path-like object>`.
+ Accepts an iterable of :term:`path-like objects <path-like object>`.
.. function:: commonprefix(list)
def commonpath(paths):
"""Given a sequence 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')
- paths = tuple(map(os.fspath, paths))
if isinstance(paths[0], bytes):
sep = b'/'
curdir = b'.'
self.assertRaises(exc, posixpath.commonpath,
[os.fsencode(p) for p in paths])
+ self.assertRaises(TypeError, posixpath.commonpath, None)
self.assertRaises(ValueError, posixpath.commonpath, [])
+ self.assertRaises(ValueError, posixpath.commonpath, iter([]))
check_error(ValueError, ['/usr', 'usr'])
check_error(ValueError, ['usr', '/usr'])
--- /dev/null
+:func:`posixpath.commonpath()` now raises a :exc:`ValueError` exception when
+passed an empty iterable. Previously, :exc:`IndexError` was raised.
+
+:func:`posixpath.commonpath()` now raises a :exc:`TypeError` exception when
+passed ``None``. Previously, :exc:`ValueError` was raised.