I know how to safely get keys from json using .get()
data = {"person": {"name": "chris", "age": 11, "interests": []}}
data.get("person", {}).get("height")
would just return None
But what if I wanted to do the same with a list?
data.get("person", {}).get("interests", []).get([3], {}).get("someotherdata")
How do I assume the list index exists and carry on safely if it doesn't?
Obviously I could just try getting the list and checking its length before trying to get the index, but is there not a cleaner way?
Chris
CodePudding user response:
You can use match-case
:
data = {"person": {"name": "chris", "age": 11, "interests": []}}
match data:
case {"person": {"interests": [_, _, _, val, *_]}}:
print(val)
case _: #default case, only executes no match is made
pass
Here, the case
block attempts to match a nested dictionary containing the keys "person"
and "interests"
, and then provides a match if the "interests"
key has a corresponding list with an index of three.
In the example above, nothing will be printed, since the list value for "interests"
is empty. However, if "interests"
has an index of 3
, 4
will be printed:
data = {"person": {"name": "chris", "age": 11, "interests": [1, 2, 3, 4]}}
match data:
case {"person": {"interests": [_, _, _, val, *_]}}:
print(val)
case _:
pass
Output:
4
Edit: purely inline solution:
r = v[3] if len(v:=data.get('person', {}).get('interests', [])) > 3 else {}