[utils] Add ability to control skipping false values in dict_get
authorSergey M․ <dstftw@gmail.com>
Sun, 7 Feb 2016 02:13:04 +0000 (08:13 +0600)
committerSergey M․ <dstftw@gmail.com>
Sun, 7 Feb 2016 02:13:04 +0000 (08:13 +0600)
test/test_utils.py
youtube_dl/utils.py

index e3dd019af2c5c5d0fa14d4289d3fb0a643ba453e..909d0e51d7d4594e85522fa48f00ae9cba66b19b 100644 (file)
@@ -452,9 +452,15 @@ class TestUtil(unittest.TestCase):
         self.assertTrue(isinstance(data, bytes))
 
     def test_dict_get(self):
-        d = {
-            'a': 42,
+        FALSE_VALUES = {
+            'none': None,
+            'false': False,
+            'zero': 0,
+            'empty_string': '',
+            'empty_list': [],
         }
+        d = FALSE_VALUES.copy()
+        d['a'] = 42
         self.assertEqual(dict_get(d, 'a'), 42)
         self.assertEqual(dict_get(d, 'b'), None)
         self.assertEqual(dict_get(d, 'b', 42), 42)
@@ -463,6 +469,9 @@ class TestUtil(unittest.TestCase):
         self.assertEqual(dict_get(d, ('b', 'c', 'a', 'd', )), 42)
         self.assertEqual(dict_get(d, ('b', 'c', )), None)
         self.assertEqual(dict_get(d, ('b', 'c', ), 42), 42)
+        for key, false_value in FALSE_VALUES.items():
+            self.assertEqual(dict_get(d, ('b', 'c', key, )), None)
+            self.assertEqual(dict_get(d, ('b', 'c', key, ), skip_false_values=False), false_value)
 
     def test_encode_compat_str(self):
         self.assertEqual(encode_compat_str(b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82', 'utf-8'), 'тест')
index 652dba59d59528fa1dd9fd58fb3052e9ccb5623f..f3b0180abb050173099e03ccde81c8412898e19f 100644 (file)
@@ -1717,11 +1717,12 @@ def encode_dict(d, encoding='utf-8'):
     return dict((encode(k), encode(v)) for k, v in d.items())
 
 
-def dict_get(d, key_or_keys, default=None):
+def dict_get(d, key_or_keys, default=None, skip_false_values=True):
     if isinstance(key_or_keys, (list, tuple)):
         for key in key_or_keys:
-            if d.get(key):
-                return d[key]
+            if key not in d or d[key] is None or skip_false_values and not d[key]:
+                continue
+            return d[key]
         return default
     return d.get(key_or_keys, default)