def _grow_ancestors(self, nx_digraph, root_node_key, successor_keys,
re_args={}):
successor_keys = {k: k.format(**re_args) for k in successor_keys}
# grow the graph using DFS
for template_key, key in six.viewitems(successor_keys):
regex_key, node, match_object = self.match_node(key)
# for merging node, we use key as the 'key' in nx_digraph
mode = self._node_mode_dict[node]
if mode == 'full':
node_key = (self._node_key_dict[node]['keys']
+ self._node_key_dict[node]['re_escape_keys'])
elif mode == 'one':
node_key = key
else:
raise ValueError("Mode '%s' is not supported." % mode)
re_args = match_object.groupdict()
if node_key not in nx_digraph:
attr = self._node_attr_dict[node].copy()
attr.setdefault('__name__', node)
attr['__re_args__'] = re_args
nx_digraph.add_node(node_key, attr)
self._grow_ancestors(nx_digraph, node_key,
self._node_succesor_dict[node], re_args)
if not nx_digraph.has_edge(root_node_key, node_key):
nx_digraph.add_edge(root_node_key, node_key,
keys=set(), template_keys={})
edge_attr = nx_digraph[root_node_key][node_key]
edge_attr['keys'].add(key)
edge_attr['template_keys'].update(((template_key, key),))
评论列表
文章目录