From: Jan Malakhovski <oxij@oxij.org>
To: notmuch@notmuchmail.org
Subject: [PATCH] python: fix get_filenames() and make it actually usable
Date: Fri, 31 Jul 2015 01:36:26 +0000 [thread overview]
Message-ID: <1438306586-7597-1-git-send-email-oxij@oxij.org> (raw)
The problem with the previous implementation is that different
versions of python exhaust __iter__() differently and the
implementation that can be exhausted is not only absolutely unusable
in the user code, but it also can not be consistently used with both
python 2.* and 3.*.
This doesn't change the interface.
---
bindings/python/notmuch/filenames.py | 84 +++++++++++-------------------------
1 file changed, 26 insertions(+), 58 deletions(-)
diff --git a/bindings/python/notmuch/filenames.py b/bindings/python/notmuch/filenames.py
index 229f414..e2b8886 100644
--- a/bindings/python/notmuch/filenames.py
+++ b/bindings/python/notmuch/filenames.py
@@ -65,6 +65,18 @@ class Filenames(Python3StringMixIn):
_get.argtypes = [NotmuchFilenamesP]
_get.restype = c_char_p
+ _valid = nmlib.notmuch_filenames_valid
+ _valid.argtypes = [NotmuchFilenamesP]
+ _valid.restype = bool
+
+ _move_to_next = nmlib.notmuch_filenames_move_to_next
+ _move_to_next.argtypes = [NotmuchFilenamesP]
+ _move_to_next.restype = None
+
+ _destroy = nmlib.notmuch_filenames_destroy
+ _destroy.argtypes = [NotmuchFilenamesP]
+ _destroy.restype = None
+
def __init__(self, files_p, parent):
"""
:param files_p: A pointer to an underlying *notmuch_tags_t*
@@ -83,68 +95,24 @@ class Filenames(Python3StringMixIn):
if not files_p:
raise NullPointerError()
- self._files_p = files_p
+ self._list = []
+ while self._valid(files_p):
+ file_ = self._get(files_p)
+ self._move_to_next(files_p)
+ self._list.append(file_.decode('utf-8', 'ignore'))
+ self._destroy(files_p)
+
#save reference to parent object so we keep it alive
self._parent = parent
def __iter__(self):
- """ Make Filenames an iterator """
- return self
-
- _valid = nmlib.notmuch_filenames_valid
- _valid.argtypes = [NotmuchFilenamesP]
- _valid.restype = bool
-
- _move_to_next = nmlib.notmuch_filenames_move_to_next
- _move_to_next.argtypes = [NotmuchFilenamesP]
- _move_to_next.restype = None
-
- def __next__(self):
- if not self._files_p:
- raise NotInitializedError()
-
- if not self._valid(self._files_p):
- self._files_p = None
- raise StopIteration
-
- file_ = Filenames._get(self._files_p)
- self._move_to_next(self._files_p)
- return file_.decode('utf-8', 'ignore')
- next = __next__ # python2.x iterator protocol compatibility
-
- def __unicode__(self):
- """Represent Filenames() as newline-separated list of full paths
-
- .. note::
-
- This method exhausts the iterator object, so you will not be able to
- iterate over them again.
- """
- return "\n".join(self)
-
- _destroy = nmlib.notmuch_filenames_destroy
- _destroy.argtypes = [NotmuchMessageP]
- _destroy.restype = None
-
- def __del__(self):
- """Close and free the notmuch filenames"""
- if self._files_p:
- self._destroy(self._files_p)
+ """Make Filenames an iterator"""
+ return self._list.__iter__()
def __len__(self):
- """len(:class:`Filenames`) returns the number of contained files
+ """len(:class:`Filenames`) returns the number of contained files"""
+ return self._list.__len__()
- .. note::
-
- This method exhausts the iterator object, so you will not be able to
- iterate over them again.
- """
- if not self._files_p:
- raise NotInitializedError()
-
- i = 0
- while self._valid(self._files_p):
- self._move_to_next(self._files_p)
- i += 1
- self._files_p = None
- return i
+ def __unicode__(self):
+ """Represent Filenames() as newline-separated list of full paths"""
+ return "\n".join(self)
--
2.4.1
next reply other threads:[~2015-07-31 1:44 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-31 1:36 Jan Malakhovski [this message]
2015-07-31 9:42 ` [PATCH] python: fix get_filenames() and make it actually usable Tomi Ollila
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1438306586-7597-1-git-send-email-oxij@oxij.org \
--to=oxij@oxij.org \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).