Closes #25742: locale.setlocale() now accepts a Unicode string for its second
parameter.
diff --git a/Lib/locale.py b/Lib/locale.py
index 15c53ba..f547bab 100644
--- a/Lib/locale.py
+++ b/Lib/locale.py
@@ -18,6 +18,10 @@
import operator
import functools
+# keep a copy of the builtin str type, because 'str' name is overriden
+# in globals by a function below
+_str = str
+
try:
_unicode = unicode
except NameError:
@@ -573,7 +577,7 @@
category may be given as one of the LC_* values.
"""
- if locale and type(locale) is not type(""):
+ if locale and not isinstance(locale, (_str, _unicode)):
# convert to string
locale = normalize(_build_localename(locale))
return _setlocale(category, locale)
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
index 719175b..140388a 100644
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -493,6 +493,16 @@
# longer accept unicode strings.
self.assertEqual(locale.normalize(u'en_US'), 'en_US.ISO8859-1')
+ def test_setlocale_unicode(self):
+ old_loc = locale.getlocale(locale.LC_ALL)
+ try:
+ user_locale = locale.setlocale(locale.LC_ALL, '')
+ unicode_locale = user_locale.decode('utf-8')
+ user_locale2 = locale.setlocale(locale.LC_ALL, unicode_locale)
+ self.assertEqual(user_locale, user_locale2)
+ finally:
+ locale.setlocale(locale.LC_ALL, old_loc)
+
def test_main():
tests = [