mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
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>
This commit is contained in:
parent
e2ecf2b0eb
commit
096c600b96
4 changed files with 14 additions and 49 deletions
|
@ -8,7 +8,11 @@ Files and directories
|
||||||
|
|
||||||
.. autoclass:: Filenames
|
.. 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
|
:class:`Directoy` -- A directory entry in the database
|
||||||
------------------------------------------------------
|
------------------------------------------------------
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
.. autoclass:: Threads
|
.. 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__
|
||||||
|
|
|
@ -48,7 +48,7 @@ class Filenames(Python3StringMixIn):
|
||||||
|
|
||||||
as well as::
|
as well as::
|
||||||
|
|
||||||
number_of_names = len(names)
|
list_of_names = list(names)
|
||||||
|
|
||||||
and even a simple::
|
and even a simple::
|
||||||
|
|
||||||
|
@ -130,21 +130,3 @@ class Filenames(Python3StringMixIn):
|
||||||
"""Close and free the notmuch filenames"""
|
"""Close and free the notmuch filenames"""
|
||||||
if self._files_p:
|
if self._files_p:
|
||||||
self._destroy(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
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class Threads(Python3StringMixIn):
|
||||||
|
|
||||||
as well as::
|
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
|
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.
|
messages you will need to retrieve a new :class:`Threads` object.
|
||||||
|
@ -64,8 +64,7 @@ class Threads(Python3StringMixIn):
|
||||||
for thread in threads:
|
for thread in threads:
|
||||||
threadlist.append(thread)
|
threadlist.append(thread)
|
||||||
|
|
||||||
# threads is "exhausted" now and even len(threads) will raise an
|
# threads is "exhausted" now.
|
||||||
# exception.
|
|
||||||
# However it will be kept around until all retrieved Thread() objects are
|
# 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
|
# also deleted. If you did e.g. an explicit del(threads) here, the
|
||||||
# following lines would fail.
|
# following lines would fail.
|
||||||
|
@ -132,30 +131,6 @@ class Threads(Python3StringMixIn):
|
||||||
return thread
|
return thread
|
||||||
next = __next__ # python2.x iterator protocol compatibility
|
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):
|
def __nonzero__(self):
|
||||||
'''
|
'''
|
||||||
Implement truth value testing. If __nonzero__ is not
|
Implement truth value testing. If __nonzero__ is not
|
||||||
|
|
Loading…
Reference in a new issue