You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归函数返回None问题:URL清洗提取ID无法正常返回

问题分析与解决思路

你的代码逻辑本身是通顺的,调试输出也能看到最终确实生成了正确的ID-XXXX and ID-XXXX,但之所以最终返回None,核心问题出在递归调用时没有返回递归函数的执行结果。

看你代码里的这段分支逻辑:

else:
    _sanitize_urls(urls_sanitized)

当进入这个else分支时,你只是调用了递归的_sanitize_urls函数,但没有把这个函数的返回值传递回上层调用。当前函数执行完这个调用后,没有任何return语句,Python函数默认会返回None,这就是为什么main里的redact_exists最终是None。

修复方案

只需要在递归调用前加上return,把递归的结果返回给上层调用即可:

def _sanitize_urls(urls=None):
    redact_list = [ ("abcd.google.com", 3), ("xyz.yahoo.com", 4), ]
    urls_sanitized = []
    redact_found = [redact for redact in redact_list if redact[0] in urls]
    if redact_found:
        urls = urls.split(" ")
        urls_sanitized = [ words.split("/")[redact_found[0][1]] if redact_found[0][0] in words else words for words in urls ]
        urls_sanitized = " ".join(urls_sanitized)
        redact_found = [redact for redact in redact_list if redact[0] in urls_sanitized]
        if not redact_found:
            return urls_sanitized
        else:
            # 关键修改:返回递归调用的结果,让上层能拿到最终值
            return _sanitize_urls(urls_sanitized)
def main():
    urls = "https://abcd.google.com/ID-XXXX and https://xyz.yahoo.com/Id/ID-XXXX"
    redact_exists = _sanitize_urls(urls)
    print(redact_exists)  # 现在会输出:ID-XXXX and ID-XXXX
if __name__ == "__main__":
    main()

验证说明

修改后,第一次处理完abcd.google.com的URL后,发现还有xyz.yahoo.com需要处理,此时递归调用_sanitize_urls,并把递归函数返回的最终清洗结果(ID-XXXX and ID-XXXX)返回给第一次调用的_sanitize_urls,再传递给main函数,就能得到你期望的输出了。

内容的提问来源于stack exchange,提问作者Danny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:52:51