]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-93099: Fix _pyio to use locale module properly (gh-93136)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 24 May 2022 01:03:37 +0000 (18:03 -0700)
committerGitHub <noreply@github.com>
Tue, 24 May 2022 01:03:37 +0000 (18:03 -0700)
(cherry picked from commit f7fabae75c7b8ecd0c5673b5d62a15db24a05953)

Co-authored-by: Dong-hee Na <donghee.na@python.org>
Lib/_pyio.py
Lib/test/test_io.py

index 0f647eed99d81bda47eb82381b7e6798a5c7197c..0bfdeaafae274bb5d98a49ebd42600000be4ce9d 100644 (file)
@@ -2022,13 +2022,7 @@ class TextIOWrapper(TextIOBase):
         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 @@ class TextIOWrapper(TextIOBase):
             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 @@ class TextIOWrapper(TextIOBase):
         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:
index 039da535d488a330665ef057729da56a4ba74365..daccbae5b4a1da4a61c8b6346a6b3afa3c13f3b3 100644 (file)
@@ -3570,6 +3570,10 @@ class TextIOWrapperTest(unittest.TestCase):
         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)