网络编程
位置:首页>> 网络编程>> Python编程>> python 递归调用返回None的问题及解决方法

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

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

标签:python,递归,None

今天在做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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com