gh-91181: drop support for bytes on sys.path (GH-31934)

Support for bytes broke sometime between Python 3.2 and 3.6 and has been broken ever since. Trying to bring back supports is surprisingly difficult in the face of -b and checking for keys in sys.path_importer_cache. Since the support was broken for so long, trying to overcome the difficulty of bringing back the support has been deemed not worth it.

Co-authored-by: Eryk Sun <eryksun@gmail.com>
Co-authored-by: Brett Cannon <brett@python.org>
This commit is contained in:
Thomas Grainger 2022-07-17 02:07:53 +01:00 committed by GitHub
parent 2e9da8e352
commit 6da988a46c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 8 additions and 9 deletions

View file

@ -1158,7 +1158,7 @@ always available.
line option or the :envvar:`PYTHONSAFEPATH` environment variable?
A program is free to modify this list for its own purposes. Only strings
and bytes should be added to :data:`sys.path`; all other data types are
should be added to :data:`sys.path`; all other data types are
ignored during import.

View file

@ -800,10 +800,8 @@ environment variable and various other installation- and
implementation-specific defaults. Entries in :data:`sys.path` can name
directories on the file system, zip files, and potentially other "locations"
(see the :mod:`site` module) that should be searched for modules, such as
URLs, or database queries. Only strings and bytes should be present on
:data:`sys.path`; all other data types are ignored. The encoding of bytes
entries is determined by the individual :term:`path entry finders <path entry
finder>`.
URLs, or database queries. Only strings should be present on
:data:`sys.path`; all other data types are ignored.
The :term:`path based finder` is a :term:`meta path finder`, so the import
machinery begins the :term:`import path` search by calling the path

View file

@ -1475,7 +1475,7 @@ def _get_spec(cls, fullname, path, target=None):
# the list of paths that will become its __path__
namespace_path = []
for entry in path:
if not isinstance(entry, (str, bytes)):
if not isinstance(entry, str):
continue
finder = cls._path_importer_cache(entry)
if finder is not None:

View file

@ -742,7 +742,8 @@ def testBytesPath(self):
z.writestr(zinfo, test_src)
zipimport.zipimporter(filename)
zipimport.zipimporter(os.fsencode(filename))
with self.assertRaises(TypeError):
zipimport.zipimporter(os.fsencode(filename))
with self.assertRaises(TypeError):
zipimport.zipimporter(bytearray(os.fsencode(filename)))
with self.assertRaises(TypeError):

View file

@ -63,8 +63,7 @@ class zipimporter(_bootstrap_external._LoaderBasics):
# if found, or else read it from the archive.
def __init__(self, path):
if not isinstance(path, str):
import os
path = os.fsdecode(path)
raise TypeError(f"expected str, not {type(path)!r}")
if not path:
raise ZipImportError('archive path is empty', path=path)
if alt_path_sep:

View file

@ -0,0 +1 @@
Drop support for :class:`bytes` on :attr:`sys.path`.