Skip to content

Commit 60ac989

Browse files
Issue python#28563: Make plural form selection more lenient and accepting
non-integer numbers. Django tests depend on this.
1 parent b626643 commit 60ac989

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

Lib/gettext.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,14 @@ def _parse(tokens, priority=-1):
156156

157157
return result, nexttok
158158

159+
def _as_int(n):
160+
try:
161+
i = round(n)
162+
except TypeError:
163+
raise TypeError('Plural value must be an integer, got %s' %
164+
(n.__class__.__name__,)) from None
165+
return n
166+
159167
def c2py(plural):
160168
"""Gets a C expression as used in PO files for plural forms and returns a
161169
Python function that implements an equivalent expression.
@@ -179,11 +187,11 @@ def c2py(plural):
179187
elif c == ')':
180188
depth -= 1
181189

182-
ns = {}
190+
ns = {'_as_int': _as_int}
183191
exec('''if True:
184192
def func(n):
185193
if not isinstance(n, int):
186-
raise ValueError('Plural value must be an integer.')
194+
n = _as_int(n)
187195
return int(%s)
188196
''' % result, ns)
189197
return ns['func']

Lib/test/test_gettext.py

+10-6
Original file line numberDiff line numberDiff line change
@@ -365,12 +365,16 @@ def test_division(self):
365365
self.assertRaises(ZeroDivisionError, f, 0)
366366

367367
def test_plural_number(self):
368-
f = gettext.c2py('1')
369-
self.assertEqual(f(1), 1)
370-
self.assertRaises(ValueError, f, 1.0)
371-
self.assertRaises(ValueError, f, '1')
372-
self.assertRaises(ValueError, f, [])
373-
self.assertRaises(ValueError, f, object())
368+
f = gettext.c2py('n != 1')
369+
self.assertEqual(f(1), 0)
370+
self.assertEqual(f(2), 1)
371+
self.assertEqual(f(1.0), 0)
372+
self.assertEqual(f(2.0), 1)
373+
self.assertEqual(f(1.1), 1)
374+
self.assertRaises(TypeError, f, '2')
375+
self.assertRaises(TypeError, f, b'2')
376+
self.assertRaises(TypeError, f, [])
377+
self.assertRaises(TypeError, f, object())
374378

375379

376380

0 commit comments

Comments
 (0)