+ """Represents a list of notmuch messages
+
+ This object provides an iterator over a list of notmuch messages
+ (Technically, it provides a wrapper for the underlying
+ *notmuch_messages_t* structure). Do note that the underlying
+ library only provides a one-time iterator (it cannot reset the
+ iterator to the start). Thus iterating over the function will
+ "exhaust" the list of messages, and a subsequent iteration attempt
+ will raise a :exc:`NotmuchError` STATUS.NOT_INITIALIZED. Also
+ note, that any function that uses iteration will also
+ exhaust the messages. So both::
+
+ for msg in msgs: print msg
+
+ as well as::
+
+ number_of_msgs = len(msgs)
+
+ will "exhaust" the Messages. If you need to re-iterate over a list of
+ messages you will need to retrieve a new :class:`Messages` object.
+
+ Things are not as bad as it seems though, you can store and reuse
+ the single Message objects as often as you want as long as you
+ keep the parent Messages object around. (Recall that due to
+ hierarchical memory allocation, all derived Message objects will
+ be invalid when we delete the parent Messages() object, even if it
+ was already "exhausted".) So this works::
+
+ db = Database()
+ msgs = Query(db,'').search_messages() #get a Messages() object
+ msglist = []
+ for m in msgs:
+ msglist.append(m)
+
+ # msgs is "exhausted" now and even len(msgs) will raise an exception.
+ # However it will be kept around until all retrieved Message() objects are
+ # also deleted. If you did e.g. an explicit del(msgs) here, the
+ # following lines would fail.
+
+ # You can reiterate over *msglist* however as often as you want.
+ # It is simply a list with Message objects.
+
+ print (msglist[0].get_filename())
+ print (msglist[1].get_filename())
+ print (msglist[0].get_message_id())
+ """