[Python-checkins] r86260 - python/branches/py3k/Lib/os.py

victor.stinner python-checkins at python.org
Sat Nov 6 13:59:33 CET 2010


Author: victor.stinner
Date: Sat Nov  6 13:59:33 2010
New Revision: 86260

Log:
os.get_exec_path() ignores BytesWarning instead of recoding them

Use only one global warning.catch_warnings() context, instead of two local
contexts. Improve also the explaination why the function uses a local import.


Modified:
   python/branches/py3k/Lib/os.py

Modified: python/branches/py3k/Lib/os.py
==============================================================================
--- python/branches/py3k/Lib/os.py	(original)
+++ python/branches/py3k/Lib/os.py	Sat Nov  6 13:59:33 2010
@@ -382,41 +382,37 @@
     *env* must be an environment variable dict or None.  If *env* is None,
     os.environ will be used.
     """
-    # Use a local import instead of a global import to avoid bootstrap issue:
-    # the os module is used to build Python extensions.
+    # Use a local import instead of a global import to limit the number of
+    # modules loaded at startup: the os module is always loaded at startup by
+    # Python. It may also avoid a bootstrap issue.
     import warnings
 
     if env is None:
         env = environ
 
-    try:
-        # ignore BytesWarning warning
-        with warnings.catch_warnings(record=True):
-            path_list = env.get('PATH')
-    except (TypeError, BytesWarning):
-        # A BytesWarning here means that env has a b'PATH' key, but no 'PATH'
-        # key. Compare bytes and str raises a BytesWarning exception only if
-        # sys.flags.bytes_warning==2, and in this case it is not possible to
-        # create a dictionary with both keys.
-        path_list = None
+    # {b'PATH': ...}.get('PATH') and {'PATH': ...}.get(b'PATH') emit a
+    # BytesWarning when using python -b or python -bb: ignore the warning
+    with warnings.catch_warnings():
+        warnings.simplefilter("ignore", BytesWarning)
 
-    if supports_bytes_environ:
         try:
-            # ignore BytesWarning warning
-            with warnings.catch_warnings(record=True):
+            path_list = env.get('PATH')
+        except TypeError:
+            path_list = None
+
+        if supports_bytes_environ:
+            try:
                 path_listb = env[b'PATH']
-        except (KeyError, TypeError, BytesWarning):
-            # A BytesWarning here means that env has a 'PATH' key, but no
-            # b'PATH' key. See the comment above for an explaination.
-            pass
-        else:
-            if path_list is not None:
-                raise ValueError(
-                    "env cannot contain 'PATH' and b'PATH' keys")
-            path_list = path_listb
+            except (KeyError, TypeError):
+                pass
+            else:
+                if path_list is not None:
+                    raise ValueError(
+                        "env cannot contain 'PATH' and b'PATH' keys")
+                path_list = path_listb
 
-        if path_list is not None and isinstance(path_list, bytes):
-            path_list = fsdecode(path_list)
+            if path_list is not None and isinstance(path_list, bytes):
+                path_list = fsdecode(path_list)
 
     if path_list is None:
         path_list = defpath


More information about the Python-checkins mailing list