[utils] Add try_get
authorSergey M․ <dstftw@gmail.com>
Sat, 11 Jun 2016 23:05:34 +0000 (06:05 +0700)
committerSergey M․ <dstftw@gmail.com>
Sat, 11 Jun 2016 23:05:34 +0000 (06:05 +0700)
To reduce boilerplate when accessing JSON

youtube_dl/utils.py

index 0acbd67de289915ca7b6cd60f2a08985bb9d7dd4..c8308ba3a3b7e3473e53423b45c7950b57eb5aef 100644 (file)
@@ -1901,6 +1901,16 @@ def dict_get(d, key_or_keys, default=None, skip_false_values=True):
     return d.get(key_or_keys, default)
 
 
+def try_get(src, getter, expected_type=None):
+    try:
+        v = getter(src)
+    except (AttributeError, KeyError, TypeError, IndexError):
+        pass
+    else:
+        if expected_type is None or isinstance(v, expected_type):
+            return v
+
+
 def encode_compat_str(string, encoding=preferredencoding(), errors='strict'):
     return string if isinstance(string, compat_str) else compat_str(string, encoding, errors)