[utils] Let int_or_none() accept a base, like int()

pull/32742/head
dirkf 2024-03-04 20:52:58 +00:00
parent f0812d7848
commit acc383b9e3
2 changed files with 6 additions and 2 deletions

View File

@ -525,11 +525,14 @@ class TestUtil(unittest.TestCase):
self.assertEqual(float_or_none(set()), None) self.assertEqual(float_or_none(set()), None)
def test_int_or_none(self): def test_int_or_none(self):
self.assertEqual(int_or_none(42), 42)
self.assertEqual(int_or_none('42'), 42) self.assertEqual(int_or_none('42'), 42)
self.assertEqual(int_or_none(''), None) self.assertEqual(int_or_none(''), None)
self.assertEqual(int_or_none(None), None) self.assertEqual(int_or_none(None), None)
self.assertEqual(int_or_none([]), None) self.assertEqual(int_or_none([]), None)
self.assertEqual(int_or_none(set()), None) self.assertEqual(int_or_none(set()), None)
self.assertEqual(int_or_none('42', base=8), 34)
self.assertRaises(TypeError, int_or_none(42, base=8))
def test_str_to_int(self): def test_str_to_int(self):
self.assertEqual(str_to_int('123,456'), 123456) self.assertEqual(str_to_int('123,456'), 123456)

View File

@ -3852,14 +3852,15 @@ class PUTRequest(compat_urllib_request.Request):
return 'PUT' return 'PUT'
def int_or_none(v, scale=1, default=None, get_attr=None, invscale=1): def int_or_none(v, scale=1, default=None, get_attr=None, invscale=1, base=None):
if get_attr: if get_attr:
if v is not None: if v is not None:
v = getattr(v, get_attr, None) v = getattr(v, get_attr, None)
if v in (None, ''): if v in (None, ''):
return default return default
try: try:
return int(v) * invscale // scale # like int, raise if base is specified and v is not a string
return (int(v) if base is None else int(v, base=base)) * invscale // scale
except (ValueError, TypeError, OverflowError): except (ValueError, TypeError, OverflowError):
return default return default