pg.traverse

Accessible via pg.traverse, pg.symbolic.traverse.

traverse(x, preorder_visitor_fn=None, postorder_visitor_fn=None, root_path=None, parent=None)[source]

Traverse a (maybe) symbolic value using visitor functions.

Example:

@pg.members([
  ('x', pg.typing.Int())
])
class A(pg.Object):
  pass

v = [{'a': A(1)}, A(2)]
integers = []
def track_integers(k, v, p):
  if isinstance(v, int):
    integers.append((k, v))
  return pg.TraverseAction.ENTER

pg.traverse(v, track_integers)
assert integers == [('[0].a.x', 1), ('[1].x', 2)]
Return type:

bool

Parameters:
  • x – Maybe symbolic value.

  • preorder_visitor_fn – preorder visitor function. Function signature is (path, value, parent) -> should_continue.

  • postorder_visitor_fn – postorder visitor function. Function signature is (path, value, parent) -> should_continue.

  • root_path – KeyPath of root value.

  • parent – Optional parent of the root node.

Returns:

True if both preorder_visitor_fn and postorder_visitor_fn return

either TraverseAction.ENTER or TraverseAction.CONTINUE for all nodes. Otherwise False.