]> granicus.if.org Git - python/commitdiff
bpo-24744: Raises error in pkgutil.walk_packages if path is str (#1926)
authorSanyam Khurana <CuriousLearner@users.noreply.github.com>
Tue, 13 Jun 2017 17:11:14 +0000 (22:41 +0530)
committerR. David Murray <rdmurray@bitdance.com>
Tue, 13 Jun 2017 17:11:14 +0000 (13:11 -0400)
bpo-24744: Raise error in pkgutil.walk_packages if path is str

Previously an empty result list was accidentallly returned, since the
code iterated over the string as if it were the expected list of paths,
and of course found nothing.

Doc/whatsnew/3.7.rst
Lib/pkgutil.py
Lib/test/test_pkgutil.py
Misc/NEWS

index 3cdc0091b393a57afb4d59f1efe6275145dd5c08..83e1c615a8d53206bdf4c3eb9879ce5685b10fa5 100644 (file)
@@ -395,6 +395,10 @@ that may require changes to your code.
 Changes in the Python API
 -------------------------
 
+* :meth:`pkgutil.walk_packages` now raises ValueError if *path* is a string.
+  Previously an empty list was returned. (Contributed by Sanyam Khurana in
+  :issue:`24744`.)
+
 * A format string argument for :meth:`string.Formatter.format`
   is now :ref:`positional-only <positional-only_parameter>`.
   Passing it as a keyword argument was deprecated in Python 3.5. (Contributed
index e37ad4519666c16da750c39e5dda72a39145bc51..9180eaed84dfd62a016a18eda1377816783d61c2 100644 (file)
@@ -119,6 +119,9 @@ def iter_modules(path=None, prefix=''):
     """
     if path is None:
         importers = iter_importers()
+    elif isinstance(path, str):
+        raise ValueError("path must be None or list of paths to look for "
+                        "modules in")
     else:
         importers = map(get_importer, path)
 
index fc04dcfd7fc41435122444451842e216096ebc92..2887ce6cc055dab5cf19e7f2b96d29bc15155f61 100644 (file)
@@ -176,6 +176,15 @@ class PkgutilTests(unittest.TestCase):
                 continue
             del sys.modules[pkg]
 
+    def test_walk_packages_raises_on_string_or_bytes_input(self):
+
+        str_input = 'test_dir'
+        with self.assertRaises((TypeError, ValueError)):
+            list(pkgutil.walk_packages(str_input))
+
+        bytes_input = b'test_dir'
+        with self.assertRaises((TypeError, ValueError)):
+            list(pkgutil.walk_packages(bytes_input))
 
 
 class PkgutilPEP302Tests(unittest.TestCase):
index f91695d3350d46a764a3c392a44981c577cde352..31e8ec073854cc5caf6ed52119c1de0bfe2d9102 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -362,6 +362,9 @@ Extension Modules
 Library
 -------
 
+- bpo-24744: pkgutil.walk_packages function now raises ValueError if *path*
+  is a string. Patch by Sanyam Khurana.
+
 - bpo-24484: Avoid race condition in multiprocessing cleanup.
 
 - bpo-30589: Fix multiprocessing.Process.exitcode to return the opposite