[Python-checkins] gh-93099: Fix _pyio to use locale module properly (gh-93136)

corona10 webhook-mailer at python.org
Mon May 23 20:37:10 EDT 2022


https://github.com/python/cpython/commit/f7fabae75c7b8ecd0c5673b5d62a15db24a05953
commit: f7fabae75c7b8ecd0c5673b5d62a15db24a05953
branch: main
author: Dong-hee Na <donghee.na at python.org>
committer: corona10 <donghee.na92 at gmail.com>
date: 2022-05-24T09:37:01+09:00
summary:

gh-93099: Fix _pyio to use locale module properly (gh-93136)

files:
M Lib/_pyio.py
M Lib/test/test_io.py

diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 0f647eed99d81..0bfdeaafae274 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -2022,13 +2022,7 @@ def __init__(self, buffer, encoding=None, errors=None, newline=None,
         encoding = text_encoding(encoding)
 
         if encoding == "locale":
-            try:
-                import locale
-            except ImportError:
-                # Importing locale may fail if Python is being built
-                encoding = "utf-8"
-            else:
-                encoding = locale.getencoding()
+            encoding = self._get_locale_encoding()
 
         if not isinstance(encoding, str):
             raise ValueError("invalid encoding: %r" % encoding)
@@ -2162,7 +2156,7 @@ def reconfigure(self, *,
             if not isinstance(encoding, str):
                 raise TypeError("invalid encoding: %r" % encoding)
             if encoding == "locale":
-                encoding = locale.getencoding()
+                encoding = self._get_locale_encoding()
 
         if newline is Ellipsis:
             newline = self._readnl
@@ -2267,6 +2261,15 @@ def _get_decoded_chars(self, n=None):
         self._decoded_chars_used += len(chars)
         return chars
 
+    def _get_locale_encoding(self):
+        try:
+            import locale
+        except ImportError:
+            # Importing locale may fail if Python is being built
+            return "utf-8"
+        else:
+            return locale.getencoding()
+
     def _rewind_decoded_chars(self, n):
         """Rewind the _decoded_chars buffer."""
         if self._decoded_chars_used < n:
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 039da535d488a..daccbae5b4a1d 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -3570,6 +3570,10 @@ def seekable(self): return True
         F.tell = lambda x: 0
         t = self.TextIOWrapper(F(), encoding='utf-8')
 
+    def test_reconfigure_locale(self):
+        wrapper = io.TextIOWrapper(io.BytesIO(b"test"))
+        wrapper.reconfigure(encoding="locale")
+
     def test_reconfigure_encoding_read(self):
         # latin1 -> utf8
         # (latin1 can decode utf-8 encoded string)



More information about the Python-checkins mailing list