带有非空表达式列表的'return'返回'None

0 投票
3 回答
1059 浏览
提问于 2025-04-16 16:01

我现在在处理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 个回答

2

你看到的主要问题是,当一个函数“掉头”了,也就是说它执行到最后却没有返回任何值或者抛出异常时,它会默默地返回一个None给调用它的地方。

所以Daren建议你在最后加一个明确的返回,这样可以帮助你了解发生了什么,同时也要注意到递归的情况,在那里你其实并没有返回任何东西。

根据你代码的结构,目前递归的部分是有问题的,因为它不会返回一个值。

2

根据你的描述,只有一个可能的解释:要么 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!!!'
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)

?

撰写回答