From aeecafa694e8296411ad21cee1b7de094600babf Mon Sep 17 00:00:00 2001 From: Sebastian Spaeth Date: Thu, 2 Jun 2011 17:28:50 +0200 Subject: [PATCH] bindings/python: Implement Tags().__nonzero__() Analog to Threads.__nonzero__ this allows us to perform list() on a Threads() object and to repeatedly call "if Tags():" or "bool(Tags())" without implicitly invoking len(), thus exhausting our iterator. While touching this code, I added a small micro-optimization to the Tag next() function. There is no need to explicitly check _is_valid, as _get implicitly does check for validness and returns None, if there is no more Tag to fetch. This avoids some roundtrips into the library when iterating through Tags. Signed-off-by: Sebastian Spaeth --- bindings/python/notmuch/tag.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/bindings/python/notmuch/tag.py b/bindings/python/notmuch/tag.py index cf1152a1..e123b0f3 100644 --- a/bindings/python/notmuch/tag.py +++ b/bindings/python/notmuch/tag.py @@ -81,15 +81,26 @@ class Tags(object): 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) + 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 -- 2.26.2