Last active
May 22, 2023 16:26
-
-
Save yaznahar/26bd3442467aff5d126d345cca0efcad to your computer and use it in GitHub Desktop.
Simple and safe way to get value of a nested dictionray
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def key_chain(data, *args, default=None): | |
for key in args: | |
if isinstance(data, dict) and key in data: | |
data = data[key] | |
elif isinstance(data, (list, tuple)) and isinstance(key, int): | |
try: | |
data = data[key] | |
except IndexError: | |
return default | |
else: | |
return default | |
return data | |
data = { | |
'pets': [ | |
{ | |
'name' : 'Purrsloud', | |
'species' : 'Cat', | |
'favFoods' : ['wet food', 'dry food', '<strong>any</strong> food'], | |
'birthYear' : 2016, | |
'photo' : 'https://learnwebcode.github.io/json-example/images/cat-2.jpg' | |
}, | |
{ | |
'name' : 'Barksalot', | |
'species' : 'Dog', | |
'birthYear' : 2008, | |
'photo' : 'https://learnwebcode.github.io/json-example/images/dog-1.jpg' | |
}, | |
{ | |
'name' : 'Meowsalot', | |
'species' : 'Cat', | |
'favFoods' : ['tuna', 'catnip', 'celery'], | |
'birthYear' : 2012, | |
'photo' : 'https://learnwebcode.github.io/json-example/images/cat-1.jpg' | |
} | |
] | |
} | |
assert key_chain(data, 'pets', 0, 'species') == 'Cat' | |
assert key_chain(data, 'pets', 1, 'birthYear') == 2008 | |
assert key_chain(data, 'pets', 2, 'favFoods', 0) == 'tuna' | |
assert key_chain(data, 'pets', 3) is None | |
assert key_chain(data, 10) is None | |
assert key_chain(data, 'pets', 2, 'favFoods', 4) is None | |
assert key_chain(data, 'pets', 2, 'favFoods', 4, default='cookies') == 'cookies' | |
assert key_chain(data, 'pets', 0, 'mood') is None | |
assert key_chain(data, 'pets', -1, 'name') == 'Meowsalot' | |
assert key_chain(data, 'pets', -1, -1) is None | |
assert key_chain(data, 7) is None | |
assert key_chain(1, 2) is None | |
assert key_chain('kittie', 2) is None | |
assert key_chain(data, 'pets', 2, 'favFoods') == ['tuna', 'catnip', 'celery'] | |
assert key_chain(data, *range(10000)) is None |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment