[英]python recursive method returns None
我正在使用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)
控制台打印(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)
日志打印无。 我觉得这两种方式的行为都应该相同,而我实际上需要它以第二种方式工作。
我认为代码是在第一次返回else语句时返回的,而不是等待结果被过滤回顶部,如果您理解我的意思的话。
为什么这些代码段的行为有所不同的任何帮助将不胜感激
如果对于Root
所有x
, x.tag == 'ecuID'
为True
但x.get('id') == '16'
不是 True
,则循环永远不会到达return
语句,而是返回None
。
当“ Root
为空序列时(例如节点树中的任何叶元素),也会发生这种情况。
如果遇到没有 node
属性的任何<ecuID id="16">
节点,则也将返回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)
这也将遍历树,访问所有节点,直到找到您的节点,或者在没有匹配的节点时返回None
。
最好的办法就是使用getiterator()
方法:
def traverse(root):
for node in root.getiterator('ecuID'):
if node.get('id') == '16':
return node.get('corner')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.