[utils] Let int_or_none() accept a base, like int()
authordirkf <fieldhouse@gmx.net>
Mon, 4 Mar 2024 20:52:58 +0000 (20:52 +0000)
committerdirkf <fieldhouse@gmx.net>
Fri, 8 Mar 2024 13:03:42 +0000 (13:03 +0000)
test/test_utils.py
youtube_dl/utils.py

index 90d64b5811e117595995e30418579b7b65f1e666..ca36909a8cad413d96c6f99a8e715bb14b660691 100644 (file)
@@ -525,11 +525,14 @@ class TestUtil(unittest.TestCase):
         self.assertEqual(float_or_none(set()), None)
 
     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(''), None)
         self.assertEqual(int_or_none(None), None)
         self.assertEqual(int_or_none([]), 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):
         self.assertEqual(str_to_int('123,456'), 123456)
index c249e71681dc2e33e3283ca6e79ae8fef91c8ebf..03c73dff39d00b3cf9592f4f289a8ce8fdc12126 100644 (file)
@@ -3852,14 +3852,15 @@ class PUTRequest(compat_urllib_request.Request):
         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 v is not None:
             v = getattr(v, get_attr, None)
     if v in (None, ''):
         return default
     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):
         return default