Optimize importlib's case-sensitivity check by wasting as little time as possible...
authorBrett Cannon <brett@python.org>
Fri, 17 Feb 2012 14:46:48 +0000 (09:46 -0500)
committerBrett Cannon <brett@python.org>
Fri, 17 Feb 2012 14:46:48 +0000 (09:46 -0500)
Lib/importlib/_bootstrap.py

index 56afe574827affc1d111fe3e893809b36853c024..8943be86e586b4d3f2bf596abe216cae2706ba78 100644 (file)
@@ -19,28 +19,33 @@ work. One should use importlib as the public-facing version of this module.
 
 # Bootstrap-related code ######################################################
 
-# TODO: when not on any of these platforms, replace _case_ok() w/
-#       ``lambda x,y: True``.
-CASE_OK_PLATFORMS = 'win', 'cygwin', 'darwin'
+CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin'
 
-def _case_ok(directory, check):
-    """Check if the directory contains something matching 'check'
-    case-sensitively when running on Windows or OS X.
+def _case_insensitive_ok(directory, check):
+    """Check if the directory contains something matching 'check' exists in the
+    directory.
 
-    If running on Window or OS X and PYTHONCASEOK is a defined environment
-    variable then no case-sensitive check is performed. No check is done to see
-    if what is being checked for exists, so if the platform is not Windows or
-    OS X then assume the case is fine.
+    If PYTHONCASEOK is a defined environment variable then skip the
+    case-sensitivity check.
 
     """
-    if (any(map(sys.platform.startswith, CASE_OK_PLATFORMS)) and
-            b'PYTHONCASEOK' not in _os.environ):
+    if b'PYTHONCASEOK' not in _os.environ:
         if not directory:
             directory = '.'
         return check in _os.listdir(directory)
     else:
         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
@@ -1055,7 +1060,7 @@ def _setup(sys_module, imp_module):
     modules, those two modules must be explicitly passed in.
 
     """
-    global imp, sys
+    global _case_ok, imp, sys
     imp = imp_module
     sys = sys_module
 
@@ -1089,6 +1094,11 @@ def _setup(sys_module, imp_module):
     setattr(self_module, '_os', os_module)
     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):
     """Install importlib as the implementation of import.