Skip to content
34 changes: 29 additions & 5 deletions Lib/locale.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,15 @@
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",
"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", "locale_encoding_alias", "locale_alias",
"windows_locale"]

def _strcoll(a,b):
""" strcoll(string,string) -> int.
Expand All @@ -41,6 +39,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 *
Expand Down Expand Up @@ -91,6 +92,29 @@ def setlocale(category, value=None):
raise Error('_locale emulation only supports "C" locale')
return 'C'

else:
_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", "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)

# These may or may not exist in _locale, so be sure to set them.
if 'strxfrm' not in globals():
strxfrm = _strxfrm
Expand Down
8 changes: 8 additions & 0 deletions Lib/test/test_locale.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@
import sys
import codecs


class MiscTestCase(unittest.TestCase):
maxDiff = None
def test__all__(self):
extra = ["localeconv", "strcoll", "strxfrm", "getencoding",
"Error"]
support.check__all__(self, locale, extra=extra)

class LazyImportTest(unittest.TestCase):
@cpython_only
def test_lazy_import(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +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__``.
Loading