python 递归调用返回None的问题及解决方法


Posted in Python onMarch 16, 2020

今天在做python获取邮件时需要递归调用解析函数才可以解析邮件内容,最后想要将解析出的内容返回时发现返回的是None 可以内容却可以打印出来,很费解。后来在网上找到了解决方案,才想明白 在这里记录下。

原文:https://3water.com/article/182765.htm

原始测试代码如下:

def print_info(msg, indent=0):
 if indent == 0:
  for header in ['From', 'To', 'Subject']:
   value = msg.get(header, '')
   if value:
    if header == '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))
 
 if msg.is_multipart():
  parts = msg.get_payload()
  for n, part in enumerate(parts):
   print('%spart %s' % (' ' * indent, n))
   print('%s--------------------' % (' ' * indent))
   print_info(part, indent + 1) #这里是没有返回的
 else:
  content_type = msg.get_content_type()
  if content_type=='text/plain' or content_type=='text/html':
   content = msg.get_payload(decode=True)
   charset = guess_charset(msg)
   if charset:
    content = content.decode(charset)
   print('%sText: %s' % (' ' * indent, content))
   return content
  else:
   print('%sAttachment: %s' % (' ' * indent, content_type))

这样的方式返回的content是None。

修改方式如下:

def print_info(msg, indent=0):
 if indent == 0:
  for header in ['From', 'To', 'Subject']:
   value = msg.get(header, '')
   if value:
    if header == '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))
 
 if msg.is_multipart():
  parts = msg.get_payload()
  for n, part in enumerate(parts):
   print('%spart %s' % (' ' * indent, n))
   print('%s--------------------' % (' ' * indent))
   return print_info(part, indent + 1) 在递归调用时直接返回函数本身
 else:
  content_type = msg.get_content_type()
  if content_type=='text/plain' or content_type=='text/html':
   content = msg.get_payload(decode=True)
   charset = guess_charset(msg)
   if charset:
    content = content.decode(charset)
   print('%sText: %s' % (' ' * indent, content))
   return content
  else:
   print('%sAttachment: %s' % (' ' * indent, content_type))

区别在于递归调用的时候,要将函数本身一起返回。这样就可以将最后的递归结果一点一点返回,可以解决返回的结果为None的问题。

总结

到此这篇关于python 递归调用返回None的问题及解决方法的文章就介绍到这了,更多相关python 递归返回None 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
跟老齐学Python之不要红头文件(2)
Sep 28 Python
优化Python代码使其加快作用域内的查找
Mar 30 Python
Python实现简单多线程任务队列
Feb 27 Python
详解MySQL数据类型int(M)中M的含义
Nov 20 Python
python中lambda()的用法
Nov 16 Python
python中的set实现不重复的排序原理
Jan 24 Python
python docx 中文字体设置的操作方法
May 08 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
Pyhton模块和包相关知识总结
May 12 Python
Selenium浏览器自动化如何上传文件
Apr 06 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 #Python
django中的数据库迁移的实现
Mar 16 #Python
django之从html页面表单获取输入的数据实例
Mar 16 #Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 #Python
Python Django view 两种return的实现方式
Mar 16 #Python
Python 统计位数为偶数的数字代码详解
Mar 15 #Python
使用pygame编写Flappy bird小游戏
Mar 14 #Python
You might like
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
多广告投放代码 推荐
2006/11/13 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
React快速入门教程
2017/01/17 Javascript
react项目实践之webpack-dev-serve
2018/09/14 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python2.x中文乱码问题解决方法
2015/06/02 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
django跳转页面传参的实现
2020/09/17 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
职工运动会感言
2014/02/07 职场文书
怎么写自荐书范文
2014/02/12 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
社区清明节活动总结
2014/07/04 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
JavaScript设计模式之原型模式详情
2022/06/21 Javascript