mirror of https://github.com/python/cpython
Issue #28563: Make plural form selection more lenient and accepting
non-integer numbers. Django tests depend on this.
This commit is contained in:
commit
39d2dfef44
|
@ -158,6 +158,14 @@ def _parse(tokens, priority=-1):
|
|||
|
||||
return result, nexttok
|
||||
|
||||
def _as_int(n):
|
||||
try:
|
||||
i = round(n)
|
||||
except TypeError:
|
||||
raise TypeError('Plural value must be an integer, got %s' %
|
||||
(n.__class__.__name__,)) from None
|
||||
return n
|
||||
|
||||
def c2py(plural):
|
||||
"""Gets a C expression as used in PO files for plural forms and returns a
|
||||
Python function that implements an equivalent expression.
|
||||
|
@ -181,11 +189,11 @@ def c2py(plural):
|
|||
elif c == ')':
|
||||
depth -= 1
|
||||
|
||||
ns = {}
|
||||
ns = {'_as_int': _as_int}
|
||||
exec('''if True:
|
||||
def func(n):
|
||||
if not isinstance(n, int):
|
||||
raise ValueError('Plural value must be an integer.')
|
||||
n = _as_int(n)
|
||||
return int(%s)
|
||||
''' % result, ns)
|
||||
return ns['func']
|
||||
|
|
|
@ -440,12 +440,16 @@ class PluralFormsTestCase(GettextBaseTest):
|
|||
self.assertRaises(ZeroDivisionError, f, 0)
|
||||
|
||||
def test_plural_number(self):
|
||||
f = gettext.c2py('1')
|
||||
self.assertEqual(f(1), 1)
|
||||
self.assertRaises(ValueError, f, 1.0)
|
||||
self.assertRaises(ValueError, f, '1')
|
||||
self.assertRaises(ValueError, f, [])
|
||||
self.assertRaises(ValueError, f, object())
|
||||
f = gettext.c2py('n != 1')
|
||||
self.assertEqual(f(1), 0)
|
||||
self.assertEqual(f(2), 1)
|
||||
self.assertEqual(f(1.0), 0)
|
||||
self.assertEqual(f(2.0), 1)
|
||||
self.assertEqual(f(1.1), 1)
|
||||
self.assertRaises(TypeError, f, '2')
|
||||
self.assertRaises(TypeError, f, b'2')
|
||||
self.assertRaises(TypeError, f, [])
|
||||
self.assertRaises(TypeError, f, object())
|
||||
|
||||
|
||||
class GNUTranslationParsingTest(GettextBaseTest):
|
||||
|
|
Loading…
Reference in New Issue