code: def walk(self, work, predicate=None):
      
      if not callable(work):
        raise ValueError('work must be callable but was {}'.format(work))
      if predicate and not callable(predicate):
        raise ValueError('predicate must be callable but was {}'.format(predicate))
      self._build_graph.walk_transitive_dependency_graph([self.address], work, predicate)
docs: Walk of this target's dependency graph, DFS preorder traversal, visiting each node exactly
      once.
  
      If a predicate is supplied it will be used to test each target before handing the target to
      work and descending. Work can return targets in which case these will be added to the walk
      candidate set if not already walked.
  
      :API: public
  
      :param work: Callable that takes a :py:class:`pants.build_graph.target.Target`
        as its single argument.
      :param predicate: Callable that takes a :py:class:`pants.build_graph.target.Target`
        as its single argument and returns True if the target should passed to ``work``.