31 lines
1.2 KiB
Python
31 lines
1.2 KiB
Python
from typing import Any, Dict, Hashable, Sequence
|
|
|
|
NOT_PRESENT_IN_STATE = object()
|
|
"""
|
|
Need an object to return when the sim state does not contain a requested value. Cannot use None because sometimes
|
|
the thing requested in the state could equal None. This NOT_PRESENT_IN_STATE is a sentinel for this purpose.
|
|
"""
|
|
|
|
|
|
def access_from_nested_dict(dictionary: Dict, keys: Sequence[Hashable]) -> Any:
|
|
"""
|
|
Access an item from a deeply dictionary with a list of keys.
|
|
|
|
For example, if the dictionary is {1: 'a', 2: {3: {4: 'b'}}}, then the key [2, 3, 4] would return 'b', and the key
|
|
[2, 3] would return {4: 'b'}. Raises a KeyError if specified key does not exist at any level of nesting.
|
|
|
|
:param dictionary: Deeply nested dictionary
|
|
:type dictionary: Dict
|
|
:param keys: List of dict keys used to traverse the nested dict. Each item corresponds to one level of depth.
|
|
:type keys: List[Hashable]
|
|
:return: The value in the dictionary
|
|
:rtype: Any
|
|
"""
|
|
key_list = [*keys] # copy keys to a new list to prevent editing original list
|
|
if len(key_list) == 0:
|
|
return dictionary
|
|
k = key_list.pop(0)
|
|
if k not in dictionary:
|
|
return NOT_PRESENT_IN_STATE
|
|
return access_from_nested_dict(dictionary[k], key_list)
|