Skip to content

Commit ce098f6

Browse files
committed
Add map access feature for lists
1 parent d639cff commit ce098f6

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

yangson/instance.py

+27
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,9 @@ def __init__(self, key: InstanceKey, value: Value,
137137
self.value = value # type: Value
138138
"""Value of the receiver."""
139139

140+
"""" Mapping from key tuple to children """
141+
self._childmap = None # type: dict
142+
140143
@property
141144
def name(self) -> InstanceName:
142145
"""Name of the receiver."""
@@ -178,6 +181,8 @@ def __getitem__(self, key: InstanceKey) -> "InstanceNode":
178181
`name`.
179182
InstanceValueError: If the receiver's value is not an object.
180183
"""
184+
if isinstance(self.value, ArrayValue) and isinstance(key, tuple):
185+
return self._mapentry(key)
181186
if isinstance(self.value, ObjectValue):
182187
return self._member(key)
183188
if isinstance(self.value, ArrayValue):
@@ -397,6 +402,28 @@ def _entry(self, index: int) -> "ArrayEntry":
397402
except (IndexError, TypeError):
398403
raise NonexistentInstance(self.json_pointer(), "entry " + str(index)) from None
399404

405+
def _mapentry(self, key: tuple) -> "ArrayEntry":
406+
if self._childmap is None:
407+
self._childmap = {}
408+
keys = self.schema_node._key_members
409+
410+
# iterate over all childs
411+
for child in self:
412+
keylist = []
413+
414+
# collect key values into tuple
415+
for keyit in keys:
416+
keylist.append(child[keyit].value)
417+
418+
# cache mapping
419+
self._childmap[tuple(keylist)] = child
420+
421+
try:
422+
return self._childmap[key]
423+
except (KeyError):
424+
raise NonexistentInstance(self.json_pointer(),
425+
f"key '{key}'") from None
426+
400427
def _peek_schema_route(self, sroute: SchemaRoute) -> Value:
401428
irt = InstanceRoute()
402429
sn = self.schema_node

yangson/instvalue.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
EntryValue = Union[ScalarValue, "ObjectValue"]
3636
"""Type of the value a list ot leaf-list entry."""
3737

38-
InstanceKey = Union[InstanceName, int]
38+
InstanceKey = Union[InstanceName, int, tuple]
3939
"""Index of an array entry or name of an object member."""
4040

4141
MetadataObject = Dict[PrefName, ScalarValue]

0 commit comments

Comments
 (0)