From 096c600b96e5d556b67ac01263a1364d0b8e9115 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 8 Jan 2016 12:27:20 +0100 Subject: [PATCH] python: Remove {Filenames,Threads}.__len__ Remove the __len__ functions, as they exhaust the iterator, breaking 'list(x)'. This is a follow-up to 8866a89e. Signed-off-by: Justus Winter <4winter@informatik.uni-hamburg.de> --- bindings/python/docs/source/filesystem.rst | 6 ++++- bindings/python/docs/source/threads.rst | 8 ++++-- bindings/python/notmuch/filenames.py | 20 +-------------- bindings/python/notmuch/threads.py | 29 ++-------------------- 4 files changed, 14 insertions(+), 49 deletions(-) diff --git a/bindings/python/docs/source/filesystem.rst b/bindings/python/docs/source/filesystem.rst index 4eb78107..a23ae41a 100644 --- a/bindings/python/docs/source/filesystem.rst +++ b/bindings/python/docs/source/filesystem.rst @@ -8,7 +8,11 @@ Files and directories .. autoclass:: Filenames - .. automethod:: Filenames.__len__ + .. method:: Filenames.__len__ + .. warning:: + :meth:`__len__` was removed in version 0.22 as it exhausted the + iterator and broke list(Filenames()). Use `len(list(names))` + instead. :class:`Directoy` -- A directory entry in the database ------------------------------------------------------ diff --git a/bindings/python/docs/source/threads.rst b/bindings/python/docs/source/threads.rst index e5a8c8a9..4324ac82 100644 --- a/bindings/python/docs/source/threads.rst +++ b/bindings/python/docs/source/threads.rst @@ -5,6 +5,10 @@ .. autoclass:: Threads - .. automethod:: __len__ + .. method:: __len__ + .. warning:: + :meth:`__len__` was removed in version 0.22 as it exhausted the + iterator and broke list(Threads()). Use `len(list(msgs))` + instead. - .. automethod:: __str__ +.. automethod:: __str__ diff --git a/bindings/python/notmuch/filenames.py b/bindings/python/notmuch/filenames.py index 96b22c65..9e5d1a30 100644 --- a/bindings/python/notmuch/filenames.py +++ b/bindings/python/notmuch/filenames.py @@ -48,7 +48,7 @@ class Filenames(Python3StringMixIn): as well as:: - number_of_names = len(names) + list_of_names = list(names) and even a simple:: @@ -130,21 +130,3 @@ class Filenames(Python3StringMixIn): """Close and free the notmuch filenames""" if self._files_p: self._destroy(self._files_p) - - def __len__(self): - """len(:class:`Filenames`) returns the number of contained files - - .. 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 diff --git a/bindings/python/notmuch/threads.py b/bindings/python/notmuch/threads.py index f8ca34a9..a550523f 100644 --- a/bindings/python/notmuch/threads.py +++ b/bindings/python/notmuch/threads.py @@ -46,7 +46,7 @@ class Threads(Python3StringMixIn): as well as:: - number_of_msgs = len(threads) + list_of_threads = list(threads) will "exhaust" the threads. If you need to re-iterate over a list of messages you will need to retrieve a new :class:`Threads` object. @@ -64,8 +64,7 @@ class Threads(Python3StringMixIn): for thread in threads: threadlist.append(thread) - # threads is "exhausted" now and even len(threads) will raise an - # exception. + # threads is "exhausted" now. # However it will be kept around until all retrieved Thread() objects are # also deleted. If you did e.g. an explicit del(threads) here, the # following lines would fail. @@ -132,30 +131,6 @@ class Threads(Python3StringMixIn): return thread next = __next__ # python2.x iterator protocol compatibility - def __len__(self): - """len(:class:`Threads`) returns the number of contained Threads - - .. note:: As this iterates over the threads, we will not be able to - iterate over them again! So this will fail:: - - #THIS FAILS - threads = Database().create_query('').search_threads() - if len(threads) > 0: #this 'exhausts' threads - # next line raises :exc:`NotInitializedError`!!! - for thread in threads: print thread - """ - if not self._threads: - raise NotInitializedError() - - i = 0 - # returns 'bool'. On out-of-memory it returns None - while self._valid(self._threads): - self._move_to_next(self._threads) - i += 1 - # reset self._threads to mark as "exhausted" - self._threads = None - return i - def __nonzero__(self): ''' Implement truth value testing. If __nonzero__ is not