python递归方法返回None

swi*_*201 1 python jython sikuli

我正在使用sikuli(一种Jython语言,尽管它主要是python)来横向查找特定元素的xml树.

如果我写这样的代码:

xmldoc = ('/ProgramData/XXXXX/XXXXX/XXXX/file.xml')
tree = ET.parse(xmldoc)
root = tree.getroot()
transverse(root)

def transverse(Root):
    for x in Root:
        if(x.tag=='ecuID'):
            if (x.get('id')=='16'):
                print x.get('corner')
        else:
            transverse(x)
Run Code Online (Sandbox Code Playgroud)

控制台打印(5,105)(这是x.get('corner')的值)

如果代码是这样的

xmldoc = ('/ProgramData/XXXXX/XXXXX/XXXX/file.xml')
tree = ET.parse(xmldoc)
root = tree.getroot()
print transverse(root)

def transverse(Root):
    for x in Root:
        if(x.tag=='ecuID'):
            if (x.get('id')=='16'):
                return x.get('corner')
        else:
           return transverse(x)
Run Code Online (Sandbox Code Playgroud)

日志打印出无.我觉得它应该表现相同的方式,我实际上需要它以第二种方式工作.

我认为代码在第一次到达else语句时返回,而不是等待结果被过滤回到顶部,如果你理解我的意思.

任何关于为什么这些代码段行为不同的帮助都会受到极大的关注

Mar*_*ers 5

如果对于所有xRoot,x.tag == 'ecuID'Truex.get('id') == '16'没有 True,则循环永远达不到一个return语句,None而是返回.

如果Root是空序列,也会发生这种情况,例如节点树中的任何叶元素.

如果<ecuID id="16">没有 node属性的情况下遇到任何节点,那么None也会返回,因为x.get('corner')它将返回默认值.

而不是递归,为什么不使用堆栈方法?

def traverse(node):
    stack = [node]
    while stack:
        next = stack.pop()
        for node in next:
            if node.tag == 'ecuID' and node.get('id') == '16':
                return node.get('corner')
            stack.append(node)
Run Code Online (Sandbox Code Playgroud)

这也将遍历树,访问所有节点,直到找到您的节点,或者None在没有匹配节点时返回.

最重要的是这个getiterator()方法:

def traverse(root):
    for node in root.getiterator('ecuID'):
        if node.get('id') == '16':
            return node.get('corner')
Run Code Online (Sandbox Code Playgroud)