[英]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.