Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit26a9318

Browse files
[3.13]gh-124969: Fix locale.nl_langinfo(locale.ALT_DIGITS) (GH-124974) (#125232)
Returns a tuple of up to 100 strings for ALT_DIGITS lookup (an empty tuple on most locales).Previously it returned the first item of that tuple or an empty string.(cherry picked from commit21c04e1)
1 parent2019362 commit26a9318

File tree

4 files changed

+75
-5
lines changed

4 files changed

+75
-5
lines changed

‎Doc/library/locale.rst‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ The :mod:`locale` module defines the following exception and functions:
158158

159159
..function::nl_langinfo(option)
160160

161-
Return some locale-specific information as a string. This function is not
161+
Return some locale-specific information as a string (or a tuple for
162+
``ALT_DIGITS``). This function is not
162163
available on all systems, and the set of possible options might also vary
163164
across platforms. The possible argument values are numbers, for which
164165
symbolic constants are available in the locale module.
@@ -311,8 +312,7 @@ The :mod:`locale` module defines the following exception and functions:
311312

312313
..data::ALT_DIGITS
313314

314-
Get a representation of up to 100 values used to represent the values
315-
0 to 99.
315+
Get a tuple of up to 100 strings used to represent the values 0 to 99.
316316

317317

318318
..function::getdefaultlocale([envvars])

‎Lib/test/test__locale.py‎

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from_localeimport (setlocale,LC_ALL,LC_CTYPE,LC_NUMERIC,localeconv,Error)
1+
from_localeimport (setlocale,LC_ALL,LC_CTYPE,LC_NUMERIC,LC_TIME,localeconv,Error)
22
try:
33
from_localeimport (RADIXCHAR,THOUSEP,nl_langinfo)
44
exceptImportError:
@@ -74,6 +74,17 @@ def accept(loc):
7474
'ps_AF': ('\u066b','\u066c'),
7575
}
7676

77+
known_alt_digits= {
78+
'C': (0, {}),
79+
'en_US': (0, {}),
80+
'fa_IR': (100, {0:'\u06f0\u06f0',10:'\u06f1\u06f0',99:'\u06f9\u06f9'}),
81+
'ja_JP': (100, {0:'\u3007',10:'\u5341',99:'\u4e5d\u5341\u4e5d'}),
82+
'lzh_TW': (32, {0:'\u3007',10:'\u5341',31:'\u5345\u4e00'}),
83+
'my_MM': (100, {0:'\u1040\u1040',10:'\u1041\u1040',99:'\u1049\u1049'}),
84+
'or_IN': (100, {0:'\u0b66',10:'\u0b67\u0b66',99:'\u0b6f\u0b6f'}),
85+
'shn_MM': (100, {0:'\u1090\u1090',10:'\u1091\u1090',99:'\u1099\u1099'}),
86+
}
87+
7788
ifsys.platform=='win32':
7889
# ps_AF doesn't work on Windows: see bpo-38324 (msg361830)
7990
delknown_numerics['ps_AF']
@@ -176,6 +187,35 @@ def test_lc_numeric_basic(self):
176187
ifnottested:
177188
self.skipTest('no suitable locales')
178189

190+
@unittest.skipUnless(nl_langinfo,"nl_langinfo is not available")
191+
@unittest.skipUnless(hasattr(locale,'ALT_DIGITS'),"requires locale.ALT_DIGITS")
192+
@unittest.skipIf(
193+
support.is_emscriptenorsupport.is_wasi,
194+
"musl libc issue on Emscripten, bpo-46390"
195+
)
196+
deftest_alt_digits_nl_langinfo(self):
197+
# Test nl_langinfo(ALT_DIGITS)
198+
tested=False
199+
forloc, (count,samples)inknown_alt_digits.items():
200+
withself.subTest(locale=loc):
201+
try:
202+
setlocale(LC_TIME,loc)
203+
setlocale(LC_CTYPE,loc)
204+
exceptError:
205+
self.skipTest(f'no locale{loc!r}')
206+
continue
207+
withself.subTest(locale=loc):
208+
alt_digits=nl_langinfo(locale.ALT_DIGITS)
209+
self.assertIsInstance(alt_digits,tuple)
210+
ifcountandnotalt_digitsandsupport.is_apple:
211+
self.skipTest(f'ALT_DIGITS is not set for locale{loc!r} on Apple platforms')
212+
self.assertEqual(len(alt_digits),count)
213+
foriinsamples:
214+
self.assertEqual(alt_digits[i],samples[i])
215+
tested=True
216+
ifnottested:
217+
self.skipTest('no suitable locales')
218+
179219
deftest_float_parsing(self):
180220
# Bug #1391872: Test whether float parsing is okay on European
181221
# locales.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix ``locale.nl_langinfo(locale.ALT_DIGITS)``. Now it returns a tuple of up
2+
to 100 strings (an empty tuple on most locales). Previously it returned the
3+
first item of that tuple or an empty string.

‎Modules/_localemodule.c‎

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,34 @@ _locale_nl_langinfo_impl(PyObject *module, int item)
608608
instead of an empty string for nl_langinfo(ERA). */
609609
constchar*result=nl_langinfo(item);
610610
result=result!=NULL ?result :"";
611-
returnPyUnicode_DecodeLocale(result,NULL);
611+
PyObject*pyresult;
612+
#ifdefALT_DIGITS
613+
if (item==ALT_DIGITS) {
614+
/* The result is a sequence of up to 100 NUL-separated strings. */
615+
constchar*s=result;
616+
intcount=0;
617+
for (;count<100&&*s;count++) {
618+
s+=strlen(s)+1;
619+
}
620+
pyresult=PyTuple_New(count);
621+
if (pyresult!=NULL) {
622+
for (inti=0;i<count;i++) {
623+
PyObject*unicode=PyUnicode_DecodeLocale(result,NULL);
624+
if (unicode==NULL) {
625+
Py_CLEAR(pyresult);
626+
break;
627+
}
628+
PyTuple_SET_ITEM(pyresult,i,unicode);
629+
result+=strlen(result)+1;
630+
}
631+
}
632+
}
633+
else
634+
#endif
635+
{
636+
pyresult=PyUnicode_DecodeLocale(result,NULL);
637+
}
638+
returnpyresult;
612639
}
613640
PyErr_SetString(PyExc_ValueError,"unsupported langinfo constant");
614641
returnNULL;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp