From 073c0c9b7f8ecf4924e8f993f8df935dec70bcc5 Mon Sep 17 00:00:00 2001 From: guoci Date: Sun, 2 Nov 2025 17:17:14 -0500 Subject: [PATCH 01/10] In `locale` module, add missing functions to `__all__` --- Lib/locale.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/locale.py b/Lib/locale.py index 37cafb4a601b3c..2a6d6d09a5261f 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -27,7 +27,8 @@ "setlocale", "localeconv", "strcoll", "strxfrm", "str", "atof", "atoi", "format_string", "currency", "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", - "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding"] + "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding", "delocalize", + "localize"] def _strcoll(a,b): """ strcoll(string,string) -> int. From 6f1e4dea96beec080901eb01d33b03de0a5b76fd Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 22:24:18 +0000 Subject: [PATCH 02/10] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20b?= =?UTF-8?q?lurb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst diff --git a/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst new file mode 100644 index 00000000000000..039f893ba36a51 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst @@ -0,0 +1 @@ +Add :func:`locale.localize` and :func:`locale.delocalize` to ``locale.__all__``. From 0984f9432f734e462fe3096f793a08a8bed93bb0 Mon Sep 17 00:00:00 2001 From: guoci Date: Mon, 3 Nov 2025 10:15:08 -0500 Subject: [PATCH 03/10] add test using `test.support.check__all__`. --- Lib/test/test_locale.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index d49f78c91da1b3..698948a4c6d5fa 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -10,6 +10,13 @@ import sys import codecs + +class MiscTestCase(unittest.TestCase): + maxDiff = None + def test__all__(self): + support.check__all__(self, locale, extra=["localeconv","strcoll","strxfrm","getencoding",], + not_exported=["locale_encoding_alias", "locale_alias","windows_locale"]) + class LazyImportTest(unittest.TestCase): @cpython_only def test_lazy_import(self): From bb1bd2ad2b677243df50fc20027f31e57366fc83 Mon Sep 17 00:00:00 2001 From: guoci Date: Mon, 3 Nov 2025 11:04:02 -0500 Subject: [PATCH 04/10] Revert "add test using `test.support.check__all__`." This reverts commit 0984f9432f734e462fe3096f793a08a8bed93bb0. --- Lib/test/test_locale.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 698948a4c6d5fa..d49f78c91da1b3 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -10,13 +10,6 @@ import sys import codecs - -class MiscTestCase(unittest.TestCase): - maxDiff = None - def test__all__(self): - support.check__all__(self, locale, extra=["localeconv","strcoll","strxfrm","getencoding",], - not_exported=["locale_encoding_alias", "locale_alias","windows_locale"]) - class LazyImportTest(unittest.TestCase): @cpython_only def test_lazy_import(self): From c304c109b2f66d7cb52a6cd78e5aad9a00d96ac7 Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 5 Nov 2025 12:38:35 -0500 Subject: [PATCH 05/10] add `support.check__all__` tests and missing constants --- Lib/locale.py | 2 +- Lib/test/test_locale.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Lib/locale.py b/Lib/locale.py index 2a6d6d09a5261f..165e692a520453 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -28,7 +28,7 @@ "str", "atof", "atoi", "format_string", "currency", "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding", "delocalize", - "localize"] + "localize", "ABDAY_1", "ABDAY_2", "ABDAY_3", "ABDAY_4", "ABDAY_5", "ABDAY_6", "ABDAY_7", "ABMON_1", "ABMON_10", "ABMON_11", "ABMON_12", "ABMON_2", "ABMON_3", "ABMON_4", "ABMON_5", "ABMON_6", "ABMON_7", "ABMON_8", "ABMON_9", "ALT_DIGITS", "CODESET", "CRNCYSTR", "DAY_1", "DAY_2", "DAY_3", "DAY_4", "DAY_5", "DAY_6", "DAY_7", "D_FMT", "D_T_FMT", "ERA", "ERA_D_FMT", "ERA_D_T_FMT", "ERA_T_FMT", "MON_1", "MON_10", "MON_11", "MON_12", "MON_2", "MON_3", "MON_4", "MON_5", "MON_6", "MON_7", "MON_8", "MON_9", "NOEXPR", "RADIXCHAR", "THOUSEP", "T_FMT", "T_FMT_AMPM", "YESEXPR"] def _strcoll(a,b): """ strcoll(string,string) -> int. diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index d49f78c91da1b3..6d1b77077a5a8d 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -10,6 +10,13 @@ import sys import codecs + +class MiscTestCase(unittest.TestCase): + maxDiff = None + def test__all__(self): + support.check__all__(self, locale, extra=["localeconv","strcoll","strxfrm","getencoding",], + not_exported=["locale_encoding_alias", "locale_alias","windows_locale", "AM_STR", "PM_STR",]) + class LazyImportTest(unittest.TestCase): @cpython_only def test_lazy_import(self): From cc9c126f023f4760a3eee7dae463e7aba27d02d3 Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 5 Nov 2025 13:53:25 -0500 Subject: [PATCH 06/10] fix tests and sync comments --- Lib/locale.py | 12 +++++++----- Lib/test/test_locale.py | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Lib/locale.py b/Lib/locale.py index 165e692a520453..06cd7df155a65c 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -17,10 +17,6 @@ from builtins import str as _builtin_str import functools -# Try importing the _locale module. -# -# If this fails, fall back on a basic 'C' locale emulation. - # Yuck: LC_MESSAGES is non-standard: can't tell whether it exists before # trying the import. So __all__ is also fiddled at the end of the file. __all__ = ["getlocale", "getdefaultlocale", "getpreferredencoding", "Error", @@ -28,7 +24,7 @@ "str", "atof", "atoi", "format_string", "currency", "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding", "delocalize", - "localize", "ABDAY_1", "ABDAY_2", "ABDAY_3", "ABDAY_4", "ABDAY_5", "ABDAY_6", "ABDAY_7", "ABMON_1", "ABMON_10", "ABMON_11", "ABMON_12", "ABMON_2", "ABMON_3", "ABMON_4", "ABMON_5", "ABMON_6", "ABMON_7", "ABMON_8", "ABMON_9", "ALT_DIGITS", "CODESET", "CRNCYSTR", "DAY_1", "DAY_2", "DAY_3", "DAY_4", "DAY_5", "DAY_6", "DAY_7", "D_FMT", "D_T_FMT", "ERA", "ERA_D_FMT", "ERA_D_T_FMT", "ERA_T_FMT", "MON_1", "MON_10", "MON_11", "MON_12", "MON_2", "MON_3", "MON_4", "MON_5", "MON_6", "MON_7", "MON_8", "MON_9", "NOEXPR", "RADIXCHAR", "THOUSEP", "T_FMT", "T_FMT_AMPM", "YESEXPR"] + "localize"] def _strcoll(a,b): """ strcoll(string,string) -> int. @@ -42,6 +38,9 @@ def _strxfrm(s): """ return s +# Try importing the _locale module. +# +# If this fails, fall back on a basic 'C' locale emulation. try: from _locale import * @@ -92,6 +91,9 @@ def setlocale(category, value=None): raise Error('_locale emulation only supports "C" locale') return 'C' +else: + __all__.extend(["ABDAY_1", "ABDAY_2", "ABDAY_3", "ABDAY_4", "ABDAY_5", "ABDAY_6", "ABDAY_7", "ABMON_1", "ABMON_10", "ABMON_11", "ABMON_12", "ABMON_2", "ABMON_3", "ABMON_4", "ABMON_5", "ABMON_6", "ABMON_7", "ABMON_8", "ABMON_9", "ALT_DIGITS", "CODESET", "CRNCYSTR", "DAY_1", "DAY_2", "DAY_3", "DAY_4", "DAY_5", "DAY_6", "DAY_7", "D_FMT", "D_T_FMT", "ERA", "ERA_D_FMT", "ERA_D_T_FMT", "ERA_T_FMT", "MON_1", "MON_10", "MON_11", "MON_12", "MON_2", "MON_3", "MON_4", "MON_5", "MON_6", "MON_7", "MON_8", "MON_9", "NOEXPR", "RADIXCHAR", "THOUSEP", "T_FMT", "T_FMT_AMPM", "YESEXPR"]) + # These may or may not exist in _locale, so be sure to set them. if 'strxfrm' not in globals(): strxfrm = _strxfrm diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 6d1b77077a5a8d..7f844bd66ba4a2 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -14,7 +14,7 @@ class MiscTestCase(unittest.TestCase): maxDiff = None def test__all__(self): - support.check__all__(self, locale, extra=["localeconv","strcoll","strxfrm","getencoding",], + support.check__all__(self, locale, extra=["localeconv","strcoll","strxfrm","getencoding","Error"], not_exported=["locale_encoding_alias", "locale_alias","windows_locale", "AM_STR", "PM_STR",]) class LazyImportTest(unittest.TestCase): From 5d6986f17cb2c19c58242509c07c54848ef9a71c Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 5 Nov 2025 15:40:54 -0500 Subject: [PATCH 07/10] fix test and code format --- Lib/locale.py | 19 ++++++++++++++++++- Lib/test/test_locale.py | 8 ++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Lib/locale.py b/Lib/locale.py index 06cd7df155a65c..1c4faf68b8ee75 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -92,7 +92,24 @@ def setlocale(category, value=None): return 'C' else: - __all__.extend(["ABDAY_1", "ABDAY_2", "ABDAY_3", "ABDAY_4", "ABDAY_5", "ABDAY_6", "ABDAY_7", "ABMON_1", "ABMON_10", "ABMON_11", "ABMON_12", "ABMON_2", "ABMON_3", "ABMON_4", "ABMON_5", "ABMON_6", "ABMON_7", "ABMON_8", "ABMON_9", "ALT_DIGITS", "CODESET", "CRNCYSTR", "DAY_1", "DAY_2", "DAY_3", "DAY_4", "DAY_5", "DAY_6", "DAY_7", "D_FMT", "D_T_FMT", "ERA", "ERA_D_FMT", "ERA_D_T_FMT", "ERA_T_FMT", "MON_1", "MON_10", "MON_11", "MON_12", "MON_2", "MON_3", "MON_4", "MON_5", "MON_6", "MON_7", "MON_8", "MON_9", "NOEXPR", "RADIXCHAR", "THOUSEP", "T_FMT", "T_FMT_AMPM", "YESEXPR"]) + _conditional_constants_names = ["ABDAY_1", "ABDAY_2", "ABDAY_3", + "ABDAY_4", "ABDAY_5", "ABDAY_6", + "ABDAY_7", "ABMON_1", "ABMON_10", + "ABMON_11", "ABMON_12", "ABMON_2", + "ABMON_3", "ABMON_4", "ABMON_5", + "ABMON_6", "ABMON_7", "ABMON_8", + "ABMON_9", "ALT_DIGITS", "CODESET", + "CRNCYSTR", "DAY_1", "DAY_2", "DAY_3", + "DAY_4", "DAY_5", "DAY_6", + "DAY_7", "D_FMT", "D_T_FMT", + "ERA", "ERA_D_FMT", "ERA_D_T_FMT", + "ERA_T_FMT", "MON_1", "MON_10", + "MON_11", "MON_12", "MON_2", "MON_3", + "MON_4", "MON_5", "MON_6", "MON_7", + "MON_8", "MON_9", "NOEXPR", + "RADIXCHAR", "THOUSEP", "T_FMT", + "T_FMT_AMPM", "YESEXPR"] + __all__.extend(vars().keys() & _conditional_constants_names) # These may or may not exist in _locale, so be sure to set them. if 'strxfrm' not in globals(): diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 7f844bd66ba4a2..55dbf6304d891b 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -14,8 +14,12 @@ class MiscTestCase(unittest.TestCase): maxDiff = None def test__all__(self): - support.check__all__(self, locale, extra=["localeconv","strcoll","strxfrm","getencoding","Error"], - not_exported=["locale_encoding_alias", "locale_alias","windows_locale", "AM_STR", "PM_STR",]) + extra = ["localeconv", "strcoll", "strxfrm", "getencoding", + "Error"] + not_exported = ["locale_encoding_alias", "locale_alias", + "windows_locale", "AM_STR", "PM_STR"] + support.check__all__(self, locale, extra=extra, + not_exported=not_exported) class LazyImportTest(unittest.TestCase): @cpython_only From b0dd8937d49dce9f68cf9ba1a6b88438cfac87b4 Mon Sep 17 00:00:00 2001 From: guoci Date: Thu, 6 Nov 2025 15:44:35 -0500 Subject: [PATCH 08/10] add comments --- Lib/locale.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/locale.py b/Lib/locale.py index 1c4faf68b8ee75..5a2cc280dd2f8e 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -109,6 +109,8 @@ def setlocale(category, value=None): "MON_8", "MON_9", "NOEXPR", "RADIXCHAR", "THOUSEP", "T_FMT", "T_FMT_AMPM", "YESEXPR"] + # The constants defined in _locale are platform-dependent, + # so we only include those that are available on the current platform. __all__.extend(vars().keys() & _conditional_constants_names) # These may or may not exist in _locale, so be sure to set them. From 569a5954113c4d77bbf673964417e006a38f3060 Mon Sep 17 00:00:00 2001 From: guoci Date: Sun, 9 Nov 2025 11:22:10 -0500 Subject: [PATCH 09/10] address issues by reviewers --- Lib/locale.py | 6 ++++-- Lib/test/test_locale.py | 5 +---- .../Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst | 5 ++++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Lib/locale.py b/Lib/locale.py index 5a2cc280dd2f8e..3be776023da3b4 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -24,7 +24,8 @@ "str", "atof", "atoi", "format_string", "currency", "normalize", "LC_CTYPE", "LC_COLLATE", "LC_TIME", "LC_MONETARY", "LC_NUMERIC", "LC_ALL", "CHAR_MAX", "getencoding", "delocalize", - "localize"] + "localize", "locale_encoding_alias", "locale_alias", + "windows_locale"] def _strcoll(a,b): """ strcoll(string,string) -> int. @@ -108,7 +109,8 @@ def setlocale(category, value=None): "MON_4", "MON_5", "MON_6", "MON_7", "MON_8", "MON_9", "NOEXPR", "RADIXCHAR", "THOUSEP", "T_FMT", - "T_FMT_AMPM", "YESEXPR"] + "T_FMT_AMPM", "YESEXPR", "AM_STR", + "PM_STR"] # The constants defined in _locale are platform-dependent, # so we only include those that are available on the current platform. __all__.extend(vars().keys() & _conditional_constants_names) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 55dbf6304d891b..aadef6a92993ce 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -16,10 +16,7 @@ class MiscTestCase(unittest.TestCase): def test__all__(self): extra = ["localeconv", "strcoll", "strxfrm", "getencoding", "Error"] - not_exported = ["locale_encoding_alias", "locale_alias", - "windows_locale", "AM_STR", "PM_STR"] - support.check__all__(self, locale, extra=extra, - not_exported=not_exported) + support.check__all__(self, locale, extra=extra) class LazyImportTest(unittest.TestCase): @cpython_only diff --git a/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst index 039f893ba36a51..5e6f165324f11d 100644 --- a/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst +++ b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst @@ -1 +1,4 @@ -Add :func:`locale.localize` and :func:`locale.delocalize` to ``locale.__all__``. +Add :func:`locale.localize`, :func:`locale.delocalize`, +``locale.locale_encoding_alias``, ``locale.locale_alias``, +``locale.windows_locale`` and platform-specific locale constants +from the :mod:`_locale` module to ``locale.__all__``. From 05b10ae08a5defcbd6a0d1ba0292c7b16784ac36 Mon Sep 17 00:00:00 2001 From: guoci Date: Sun, 9 Nov 2025 11:32:37 -0500 Subject: [PATCH 10/10] fix news item --- .../next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst index 5e6f165324f11d..3de3a1566b1427 100644 --- a/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst +++ b/Misc/NEWS.d/next/Library/2025-11-02-22-24-13.gh-issue-140924.NQVbR_.rst @@ -1,4 +1,4 @@ Add :func:`locale.localize`, :func:`locale.delocalize`, ``locale.locale_encoding_alias``, ``locale.locale_alias``, ``locale.windows_locale`` and platform-specific locale constants -from the :mod:`_locale` module to ``locale.__all__``. +from the :mod:`!_locale` module to ``locale.__all__``.