mirror of
https://github.com/PyCQA/flake8.git
synced 2026-03-31 03:06:53 +00:00
Add tree/sub-tree traversal to Trie
Accurately retrieve listeners for a specific error code
This commit is contained in:
parent
75f15340ac
commit
57e8583e29
2 changed files with 32 additions and 8 deletions
|
|
@ -35,6 +35,16 @@ class Trie(object):
|
|||
node = child
|
||||
return node
|
||||
|
||||
def traverse(self):
|
||||
"""Traverse this tree.
|
||||
|
||||
This performs a depth-first pre-order traversal of children in this
|
||||
tree. It returns the results consistently by first sorting the
|
||||
children based on their prefix and then traversing them in
|
||||
alphabetical order.
|
||||
"""
|
||||
return self.root.traverse()
|
||||
|
||||
|
||||
class TrieNode(object):
|
||||
"""The majority of the implementation details of a Trie."""
|
||||
|
|
@ -47,8 +57,8 @@ class TrieNode(object):
|
|||
|
||||
def __repr__(self):
|
||||
"""Generate an easy to read representation of the node."""
|
||||
return 'TrieNode(prefix={0}, data={1}, children={2})'.format(
|
||||
self.prefix, self.data, dict(self.children)
|
||||
return 'TrieNode(prefix={0}, data={1})'.format(
|
||||
self.prefix, self.data
|
||||
)
|
||||
|
||||
def find_prefix(self, prefix):
|
||||
|
|
@ -70,5 +80,18 @@ class TrieNode(object):
|
|||
return new_node
|
||||
|
||||
def traverse(self):
|
||||
"""Traverse children of this node in order."""
|
||||
raise NotImplementedError()
|
||||
"""Traverse children of this node.
|
||||
|
||||
This performs a depth-first pre-order traversal of the remaining
|
||||
children in this sub-tree. It returns the results consistently by
|
||||
first sorting the children based on their prefix and then traversing
|
||||
them in alphabetical order.
|
||||
"""
|
||||
if not self.children:
|
||||
return
|
||||
|
||||
for prefix in sorted(self.children.keys()):
|
||||
child = self.children[prefix]
|
||||
yield child
|
||||
for child in child.traverse():
|
||||
yield child
|
||||
|
|
|
|||
|
|
@ -7,12 +7,13 @@ class Notifier(object):
|
|||
|
||||
def listeners_for(self, error_code):
|
||||
node = self.listeners.find(error_code)
|
||||
if node is None:
|
||||
return
|
||||
for listener in node.data:
|
||||
yield listener
|
||||
if node.children:
|
||||
for child in node.traverse():
|
||||
for listener in child.data:
|
||||
yield listener
|
||||
for child in node.traverse():
|
||||
for listener in child.data:
|
||||
yield listener
|
||||
|
||||
def notify(self, error_code, *args, **kwargs):
|
||||
for listener in self.listeners_for(error_code):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue