| # Copyright (C) 2001-2006 Python Software Foundation | 
 | # Author: Barry Warsaw | 
 | # Contact: email-sig@python.org | 
 |  | 
 | """Various types of useful iterators and generators.""" | 
 |  | 
 | __all__ = [ | 
 |     'body_line_iterator', | 
 |     'typed_subpart_iterator', | 
 |     'walk', | 
 |     # Do not include _structure() since it's part of the debugging API. | 
 |     ] | 
 |  | 
 | import sys | 
 | from io import StringIO | 
 |  | 
 |  | 
 |  | 
 | # This function will become a method of the Message class | 
 | def walk(self): | 
 |     """Walk over the message tree, yielding each subpart. | 
 |  | 
 |     The walk is performed in depth-first order.  This method is a | 
 |     generator. | 
 |     """ | 
 |     yield self | 
 |     if self.is_multipart(): | 
 |         for subpart in self.get_payload(): | 
 |             for subsubpart in subpart.walk(): | 
 |                 yield subsubpart | 
 |  | 
 |  | 
 |  | 
 | # These two functions are imported into the Iterators.py interface module. | 
 | def body_line_iterator(msg, decode=False): | 
 |     """Iterate over the parts, returning string payloads line-by-line. | 
 |  | 
 |     Optional decode (default False) is passed through to .get_payload(). | 
 |     """ | 
 |     for subpart in msg.walk(): | 
 |         payload = subpart.get_payload(decode=decode) | 
 |         if isinstance(payload, str): | 
 |             for line in StringIO(payload): | 
 |                 yield line | 
 |  | 
 |  | 
 | def typed_subpart_iterator(msg, maintype='text', subtype=None): | 
 |     """Iterate over the subparts with a given MIME type. | 
 |  | 
 |     Use `maintype' as the main MIME type to match against; this defaults to | 
 |     "text".  Optional `subtype' is the MIME subtype to match against; if | 
 |     omitted, only the main type is matched. | 
 |     """ | 
 |     for subpart in msg.walk(): | 
 |         if subpart.get_content_maintype() == maintype: | 
 |             if subtype is None or subpart.get_content_subtype() == subtype: | 
 |                 yield subpart | 
 |  | 
 |  | 
 |  | 
 | def _structure(msg, fp=None, level=0, include_default=False): | 
 |     """A handy debugging aid""" | 
 |     if fp is None: | 
 |         fp = sys.stdout | 
 |     tab = ' ' * (level * 4) | 
 |     print(tab + msg.get_content_type(), end='', file=fp) | 
 |     if include_default: | 
 |         print(' [%s]' % msg.get_default_type(), file=fp) | 
 |     else: | 
 |         print(file=fp) | 
 |     if msg.is_multipart(): | 
 |         for subpart in msg.get_payload(): | 
 |             _structure(subpart, fp, level+1, include_default) |