我目前正在进行XML(SVG)遍历并遇到下一个问题:
我的函数总是在if currNode.parentNode is rootNode:
之后返回None,但正如您在下面的代码中所看到的,我已经明确地将return设置为'flag',这是非空字符串。
这里最有趣的部分是print('...')
打印三个点,所以问题就在那里(或者至少看起来像那样)。
根据Python文档:'如果存在表达式列表,则对其进行评估,否则替换为None。
因此,简而言之,问题是:
为什么'return'不会返回'flag'字符串,而是'None'而不是?
这是一段代码:
def relsLookup(currNode, rootNode):
if currNode.nextSibling is not None:
currNode = currNode.nextSibling
return currNode
elif currNode.nextSibling is None:
if currNode.parentNode is rootNode:
flag = 's2s_exception_end_of_svg'
print('...')
return flag
elif currNode.parentNode.localName == 'g':
if currNode.parentNode.nextSibling is not None:
print('<--')
currNode = currNode.parentNode.nextSibling
return currNode
elif currNode.parentNode.nextSibling is None:
print('<--')
currNode = currNode.parentNode
relsLookup(currNode, rootNode)
else:
flag = 's2s_exception_unknown_parent'
return flag
else:
flag = 's2s_exception_unknown_sibling'
return flag
答案 0 :(得分:6)
我怀疑问题出在您的代码的以下部分:
elif currNode.parentNode.nextSibling is None:
print('<--')
currNode = currNode.parentNode
relsLookup(currNode, rootNode)
你的意思是说:
elif currNode.parentNode.nextSibling is None:
print('<--')
currNode = currNode.parentNode
return relsLookup(currNode, rootNode)
答案 1 :(得分:2)
根据您的商家信息,只有一个解释:currNode.nextSibling
不是None
或者是currNode.parentNode is rootNode
,但是False
是if currNode.nextSibling is None:
if currNode.parentNode is rootNode:
flag = 'end_of_svg'
print('...')
return flag
return 'nested if failed'
return 'currNode.nextSibling is not None!!!'
。在方法/函数的末尾设置一个默认的return语句来测试它:
{{1}}
答案 2 :(得分:2)
您看到的核心问题是,“脱离结尾”的函数(即到达代码的末尾而不返回值或引发异常)将隐式地将None
返回给调用者。 / p>
因此,达人的建议是在最后包括一个明确的回报来看看发生了什么,并且aix注意到你实际上没有返回任何东西的递归情况。
鉴于代码的结构,递归情况目前已被破坏,因为它不会返回值。