Python代码: 访问者实例(访问列表,层次列表)

#!/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()
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值