From 97fe65a7bebf0f7acbd8af9537c6f4293301892e Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 23 May 2022 18:03:37 -0700 Subject: gh-93099: Fix _pyio to use locale module properly (gh-93136) (cherry picked from commit f7fabae75c7b8ecd0c5673b5d62a15db24a05953) Co-authored-by: Dong-hee Na --- Lib/_pyio.py | 19 +++++++++++-------- Lib/test/test_io.py | 4 ++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 0f647ee..0bfdeaa 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -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: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 039da53..daccbae 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -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) -- cgit v0.12