Skip to content

Instantly share code, notes, and snippets.

@yaznahar
Last active May 22, 2023 16:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yaznahar/26bd3442467aff5d126d345cca0efcad to your computer and use it in GitHub Desktop.
Save yaznahar/26bd3442467aff5d126d345cca0efcad to your computer and use it in GitHub Desktop.
Simple and safe way to get value of a nested dictionray
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