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
相关产品推荐
相关产品推荐

