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

作者:Clannad_niu 时间:2022-12-21 05:52:56 

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

原文:https://www.jb51.net/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的问题。

来源:https://blog.csdn.net/Clannad_niu/article/details/104792426

标签:python,递归,None
0
投稿

猜你喜欢

  • Python递归求出列表(包括列表中的子列表)的最大值实例

    2023-01-17 06:02:16
  • 一文让你彻底搞懂Python中__str__和__repr__

    2021-10-30 20:09:56
  • Javascript this 关键字 详解

    2024-06-07 15:51:18
  • JavaScript原生对象常用方法总结(推荐)

    2024-05-05 09:15:20
  • python Task在协程调用实例讲解

    2021-06-28 21:39:32
  • Python如何将图像音视频等资源文件隐藏在代码中(小技巧)

    2023-08-03 10:29:49
  • Pandas的AB BA类型数据框去重复

    2022-09-26 07:48:16
  • JSP学生信息管理系统

    2024-03-20 22:28:27
  • IntelliJ IDEA卡死,如何优化内存

    2023-07-04 12:10:27
  • Git 标签使用详解

    2023-09-06 14:09:32
  • python 读写excel文件操作示例【附源码下载】

    2023-02-20 09:26:31
  • oracle 优化的一点体会

    2009-10-02 17:59:00
  • python中pygame针对游戏窗口的显示方法实例分析(附源码)

    2022-04-27 11:35:12
  • python实现图片中文字分割效果

    2023-03-11 16:39:42
  • Python中if __name__ == "__main__"详细解释

    2023-10-16 06:36:56
  • 轻松解决:mysql数据库连接过多的错误

    2010-09-30 14:28:00
  • Javascript中各种trim的实现详细解析

    2024-04-18 10:55:04
  • 在Python中使用dict和set方法的教程

    2023-12-20 20:29:07
  • MySql 5.7.21免安装版本win10下的配置方法

    2024-01-23 00:45:35
  • python笔记之使用fillna()填充缺失值

    2023-12-22 19:53:49
  • asp之家 网络编程 m.aspxhome.com