Commit f2e86751 authored by Brett Cannon's avatar Brett Cannon

Optimize importlib's case-sensitivity check by wasting as little time as...

Optimize importlib's case-sensitivity check by wasting as little time as possible under case-sensitive OSs.
parent 1f14bebe
...@@ -19,28 +19,33 @@ work. One should use importlib as the public-facing version of this module. ...@@ -19,28 +19,33 @@ work. One should use importlib as the public-facing version of this module.
# Bootstrap-related code ###################################################### # Bootstrap-related code ######################################################
# TODO: when not on any of these platforms, replace _case_ok() w/ CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin'
# ``lambda x,y: True``.
CASE_OK_PLATFORMS = 'win', 'cygwin', 'darwin'
def _case_ok(directory, check): def _case_insensitive_ok(directory, check):
"""Check if the directory contains something matching 'check' """Check if the directory contains something matching 'check' exists in the
case-sensitively when running on Windows or OS X. directory.
If running on Window or OS X and PYTHONCASEOK is a defined environment If PYTHONCASEOK is a defined environment variable then skip the
variable then no case-sensitive check is performed. No check is done to see case-sensitivity check.
if what is being checked for exists, so if the platform is not Windows or
OS X then assume the case is fine.
""" """
if (any(map(sys.platform.startswith, CASE_OK_PLATFORMS)) and if b'PYTHONCASEOK' not in _os.environ:
b'PYTHONCASEOK' not in _os.environ):
if not directory: if not directory:
directory = '.' directory = '.'
return check in _os.listdir(directory) return check in _os.listdir(directory)
else: else:
return True return True
def _case_sensitive_ok(directory, check):
"""Under case-sensitive filesystems always assume the case matches.
Since other code does the file existence check, that subsumes a
case-sensitivity check.
"""
return True
_case_ok = None
# TODO: Expose from marshal # TODO: Expose from marshal
...@@ -1055,7 +1060,7 @@ def _setup(sys_module, imp_module): ...@@ -1055,7 +1060,7 @@ def _setup(sys_module, imp_module):
modules, those two modules must be explicitly passed in. modules, those two modules must be explicitly passed in.
""" """
global imp, sys global _case_ok, imp, sys
imp = imp_module imp = imp_module
sys = sys_module sys = sys_module
...@@ -1089,6 +1094,11 @@ def _setup(sys_module, imp_module): ...@@ -1089,6 +1094,11 @@ def _setup(sys_module, imp_module):
setattr(self_module, '_os', os_module) setattr(self_module, '_os', os_module)
setattr(self_module, 'path_sep', path_sep) setattr(self_module, 'path_sep', path_sep)
if sys_module.platform in CASE_INSENSITIVE_PLATFORMS:
_case_ok = _case_insensitive_ok
else:
_case_ok = _case_sensitive_ok
def _install(sys_module, imp_module): def _install(sys_module, imp_module):
"""Install importlib as the implementation of import. """Install importlib as the implementation of import.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment