From: Sebastian Spaeth <Sebastian@SSpaeth.de>
Date: Thu, 2 Jun 2011 15:28:50 +0000 (+0200)
Subject: bindings/python: Implement Tags().__nonzero__()
X-Git-Tag: debian/0.6_254~59
X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=aeecafa694e8296411ad21cee1b7de094600babf;p=notmuch-old

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 <Sebastian@SSpaeth.de>
---

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