class Tags(object):
"""Represents a list of notmuch tags
- This object provides an iterator over a list of notmuch tags. 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 tags, and a subsequent
+ This object provides an iterator over a list of notmuch tags (which
+ are unicode instances).
+
+ 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 tags, and a subsequent
iteration attempt will raise a :exc:`NotmuchError`
STATUS.NOT_INITIALIZED. Also note, that any function that uses
iteration (nearly all) will also exhaust the tags. So both::
def next(self):
if self._tags is None:
raise NotmuchError(STATUS.NOT_INITIALIZED)
-
- if not nmlib.notmuch_tags_valid(self._tags):
+ # No need to call nmlib.notmuch_tags_valid(self._tags);
+ # Tags._get safely returns None, if there is no more valid tag.
+ tag = Tags._get(self._tags).decode('utf-8')
+ if tag is None:
self._tags = None
raise StopIteration
-
- tag = Tags._get (self._tags)
nmlib.notmuch_tags_move_to_next(self._tags)
return tag
+ def __nonzero__(self):
+ """Implement bool(Tags) check that can be repeatedly used
+
+ If __nonzero__ is not implemented, "if Tags()"
+ will implicitly call __len__, using up our iterator, so it is
+ important that this function is defined.
+
+ :returns: True if the Tags() iterator has at least one more Tag
+ left."""
+ return nmlib.notmuch_tags_valid(self._tags) > 0
+
def __len__(self):
"""len(:class:`Tags`) returns the number of contained tags
raise NotmuchError(STATUS.NOT_INITIALIZED)
i=0
- while nmlib.notmuch_tags_valid(self._msgs):
- nmlib.notmuch_tags_move_to_next(self._msgs)
+ while nmlib.notmuch_tags_valid(self._tags):
+ nmlib.notmuch_tags_move_to_next(self._tags)
i += 1
self._tags = None
return i