1515from .exceptions import JSONPathIndexError
1616from .exceptions import JSONPathTypeError
1717from .filter_expressions import FilterContext
18- from .node import JSONPathNode
1918
2019if TYPE_CHECKING :
2120 from .environment import JSONPathEnvironment
2221 from .filter_expressions import FilterExpression
22+ from .node import JSONPathNode
2323 from .tokens import Token
2424
2525
@@ -76,11 +76,7 @@ def resolve(self, node: JSONPathNode) -> Iterable[JSONPathNode]:
7676 """Select a value from a dict/object by its property/key."""
7777 if isinstance (node .value , dict ):
7878 with suppress (KeyError ):
79- yield JSONPathNode (
80- value = node .value [self .name ],
81- location = node .location + (self .name ,),
82- root = node .root ,
83- )
79+ yield node .new_child (node .value [self .name ], self .name )
8480
8581
8682class IndexSelector (JSONPathSelector ):
@@ -125,12 +121,7 @@ def resolve(self, node: JSONPathNode) -> Iterable[JSONPathNode]:
125121 if isinstance (node .value , list ):
126122 norm_index = self ._normalized_index (node .value )
127123 with suppress (IndexError ):
128- _node = JSONPathNode (
129- value = node .value [self .index ],
130- location = node .location + (norm_index ,),
131- root = node .root ,
132- )
133- yield _node
124+ yield node .new_child (node .value [self .index ], norm_index )
134125
135126
136127class SliceSelector (JSONPathSelector ):
@@ -185,13 +176,7 @@ def resolve(self, node: JSONPathNode) -> Iterable[JSONPathNode]:
185176 idx = self .slice .start or 0
186177 step = self .slice .step or 1
187178 for element in node .value [self .slice ]:
188- norm_index = self ._normalized_index (node .value , idx )
189- _node = JSONPathNode (
190- value = element ,
191- location = node .location + (norm_index ,),
192- root = node .root ,
193- )
194- yield _node
179+ yield node .new_child (element , self ._normalized_index (node .value , idx ))
195180 idx += step
196181
197182
@@ -221,21 +206,11 @@ def resolve(self, node: JSONPathNode) -> Iterable[JSONPathNode]:
221206 members = node .value .items ()
222207
223208 for name , val in members :
224- _node = JSONPathNode (
225- value = val ,
226- location = node .location + (name ,),
227- root = node .root ,
228- )
229- yield _node
209+ yield node .new_child (val , name )
230210
231211 elif isinstance (node .value , list ):
232212 for i , element in enumerate (node .value ):
233- _node = JSONPathNode (
234- value = element ,
235- location = node .location + (i ,),
236- root = node .root ,
237- )
238- yield _node
213+ yield node .new_child (element , i )
239214
240215
241216class Filter (JSONPathSelector ):
@@ -284,11 +259,7 @@ def resolve(self, node: JSONPathNode) -> Iterable[JSONPathNode]: # noqa: PLR091
284259 )
285260 try :
286261 if self .expression .evaluate (context ):
287- yield JSONPathNode (
288- value = val ,
289- location = node .location + (name ,),
290- root = node .root ,
291- )
262+ yield node .new_child (val , name )
292263 except JSONPathTypeError as err :
293264 if not err .token :
294265 err .token = self .token
@@ -303,11 +274,7 @@ def resolve(self, node: JSONPathNode) -> Iterable[JSONPathNode]: # noqa: PLR091
303274 )
304275 try :
305276 if self .expression .evaluate (context ):
306- yield JSONPathNode (
307- value = element ,
308- location = node .location + (i ,),
309- root = node .root ,
310- )
277+ yield node .new_child (element , i )
311278 except JSONPathTypeError as err :
312279 if not err .token :
313280 err .token = self .token
0 commit comments