#!/usr/bin/env python
#coding=utf-8
#
#版权所有 (c) 2014 yao_yu (http://blog.csdn.net/yao_yu_126)
#本代码采用MIT许可
#
#2014-04-07
# 1. 加入平台判断
# 2. 公共代码提取为函数
import xml.etree.cElementTree as ET
import platform
is_windows_system = platform.system() in ('Windows',)
#---------------------------- visit method ----------------------------#
def visit_array(array, visitor):
for item in array:
if visitor(item):
return True
def is_tree_node(node):
return isinstance(node, (list, tuple, ET.Element))
if is_windows_system:
def is_tree_node(node):
if node is not None and hasattr(node, 'attrib'):
return True
return isinstance(node, (list, tuple))
def visit_tree_node(node, visitor):
if not is_tree_node(node):
return
for subnode in node:
if(visitor(subnode)):
return True
if(is_tree_node(subnode) and len(subnode) and visit_tree_node(subnode, visitor)):
return True
def visit_tree_node_slibing(node, visitor):
if not is_tree_node(node):
return
for subnode in node:
if(visitor(subnode)):
return True
for subnode in node:
if(is_tree_node(subnode) and len(subnode)
and visit_tree_node_slibing(subnode, visitor)):
return True
def visit_tree_nodepair(node, visitor):
if not is_tree_node(node):
return
for subnode in node:
if(visitor((node, subnode))):
return True
if (is_tree_node(subnode) and len(subnode)
and visit_tree_nodepair(subnode, visitor)):
return True
def visit_tree_nodepair_slibing(node, visitor):
if not is_tree_node(node):
return
for subnode in node:
if(visitor((node, subnode))):
return True
for subnode in node:
if (is_tree_node(subnode) and len(subnode)
and visit_tree_nodepair_slibing(subnode, visitor)):
return True
#---------------------------- visitor ----------------------------#
class CListVisitor(object):
def __init__(self, *visitors, terminate = True):
if (visitors
and isinstance(visitors, (list, tuple))
and isinstance(visitors[0], (list, tuple))):
visitors = visitors[0]
self._visitors = list(visitors)
self._terminate = terminate
def __call__(self, *args, **kwdargs):
for visitor in self._visitors:
if visitor(*args, **kwdargs):
return self._terminate
def append(self, visitor):
assert(visitor)
self._visitors.append(visitor)
if __name__ == '__main__':
import unittest
class CTestVisitor(unittest.TestCase):
def test001(self):
def print2(*args, **kwdargs):
print(args, kwdargs)
b = []
alistvisitor = CListVisitor()
alistvisitor.append(b.append)
a = [1,2,4]
visit_array(a, alistvisitor)
assert(a == b)
a = [1,2,3,[4,5,[6,7],8],9]
result = [1,2,3,[4,5,[6,7],8],4,5,[6,7],6,7,8,9]
b = []
visit_tree_node(a, b.append)
assert(b == result), (b, result)
b = []
visit_tree_node_slibing(a, b.append)
result = [1,2,3,[4,5,[6,7],8],9,4,5,[6,7],8,6,7]
assert(b == result)
b = []
result = [([1, 2, 3, [4, 5, [6, 7], 8], 9], 1),
([1, 2, 3, [4, 5, [6, 7], 8], 9], 2),
([1, 2, 3, [4, 5, [6, 7], 8], 9], 3),
([1, 2, 3, [4, 5, [6, 7], 8], 9], [4, 5, [6, 7], 8]),
([4, 5, [6, 7], 8], 4),
([4, 5, [6, 7], 8], 5),
([4, 5, [6, 7], 8], [6, 7]),
([6, 7], 6),
([6, 7], 7),
([4, 5, [6, 7], 8], 8),
([1, 2, 3, [4, 5, [6, 7], 8], 9], 9)]
visit_tree_nodepair(a, b.append)
assert(b == result)
b = []
result = [([1, 2, 3, [4, 5, [6, 7], 8], 9], 1),
([1, 2, 3, [4, 5, [6, 7], 8], 9], 2),
([1, 2, 3, [4, 5, [6, 7], 8], 9], 3),
([1, 2, 3, [4, 5, [6, 7], 8], 9], [4, 5, [6, 7], 8]),
([1, 2, 3, [4, 5, [6, 7], 8], 9], 9),
([4, 5, [6, 7], 8], 4),
([4, 5, [6, 7], 8], 5),
([4, 5, [6, 7], 8], [6, 7]),
([4, 5, [6, 7], 8], 8),
([6, 7], 6),
([6, 7], 7)]
visit_tree_nodepair_slibing(a, b.append)
assert(b == result)
unittest.main()
Python代码: 访问者实例(访问列表,层次列表)
最新推荐文章于 2023-03-07 18:01:39 发布