python 递归调用返回None的问题及解决方法
今天在做python获取邮件时需要递归调用解析函数才可以解析邮件内容,最后想要将解析出的内容返回时发现返回的是None可以内容却可以打印出来,很费解。后来在网上找到了解决方案,才想明白在这里记录下。
原文:https://www.nhooo.com/article/182765.htm
原始测试代码如下:
defprint_info(msg,indent=0):
ifindent==0:
forheaderin['From','To','Subject']:
value=msg.get(header,'')
ifvalue:
ifheader=='Subject':
value=decode_str(value)
else:
hdr,addr=parseaddr(value)
name=decode_str(hdr)
value=u'%s<%s>'%(name,addr)
print('%s%s:%s'%(''*indent,header,value))
ifmsg.is_multipart():
parts=msg.get_payload()
forn,partinenumerate(parts):
print('%spart%s'%(''*indent,n))
print('%s--------------------'%(''*indent))
print_info(part,indent+1)#这里是没有返回的
else:
content_type=msg.get_content_type()
ifcontent_type=='text/plain'orcontent_type=='text/html':
content=msg.get_payload(decode=True)
charset=guess_charset(msg)
ifcharset:
content=content.decode(charset)
print('%sText:%s'%(''*indent,content))
returncontent
else:
print('%sAttachment:%s'%(''*indent,content_type))
这样的方式返回的content是None。
修改方式如下:
defprint_info(msg,indent=0):
ifindent==0:
forheaderin['From','To','Subject']:
value=msg.get(header,'')
ifvalue:
ifheader=='Subject':
value=decode_str(value)
else:
hdr,addr=parseaddr(value)
name=decode_str(hdr)
value=u'%s<%s>'%(name,addr)
print('%s%s:%s'%(''*indent,header,value))
ifmsg.is_multipart():
parts=msg.get_payload()
forn,partinenumerate(parts):
print('%spart%s'%(''*indent,n))
print('%s--------------------'%(''*indent))
returnprint_info(part,indent+1)在递归调用时直接返回函数本身
else:
content_type=msg.get_content_type()
ifcontent_type=='text/plain'orcontent_type=='text/html':
content=msg.get_payload(decode=True)
charset=guess_charset(msg)
ifcharset:
content=content.decode(charset)
print('%sText:%s'%(''*indent,content))
returncontent
else:
print('%sAttachment:%s'%(''*indent,content_type))
区别在于递归调用的时候,要将函数本身一起返回。这样就可以将最后的递归结果一点一点返回,可以解决返回的结果为None的问题。
总结
到此这篇关于python递归调用返回None的问题及解决方法的文章就介绍到这了,更多相关python递归返回None内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。