带有非空表达式列表的'return'返回'None
我现在在处理XML(SVG)遍历的问题,遇到了一个麻烦:
我的函数在执行到if currNode.parentNode is rootNode:
这行时,总是返回None。尽管在下面的代码中,我明确设置了返回值为'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
3 个回答
你看到的主要问题是,当一个函数“掉头”了,也就是说它执行到最后却没有返回任何值或者抛出异常时,它会默默地返回一个None
给调用它的地方。
所以Daren建议你在最后加一个明确的返回,这样可以帮助你了解发生了什么,同时也要注意到递归的情况,在那里你其实并没有返回任何东西。
根据你代码的结构,目前递归的部分是有问题的,因为它不会返回一个值。
根据你的描述,只有一个可能的解释:要么 currNode.nextSibling
不是 None
,要么它是 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!!!'
我怀疑你代码中的问题出在以下这部分:
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)
?