From 86296ad2cd5702a66b05aae79ec9196b62e41e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergey=20M=E2=80=A4?= Date: Sun, 7 Feb 2016 08:13:04 +0600 Subject: [PATCH] [utils] Add ability to control skipping false values in dict_get --- test/test_utils.py | 13 +++++++++++-- youtube_dl/utils.py | 7 ++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/test/test_utils.py b/test/test_utils.py index e3dd019af2..909d0e51d7 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -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'), 'ั‚ะตัั‚') diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 652dba59d5..f3b0180abb 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -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)