[Biopython-dev] Bio._utils iterlen not needed
Michiel de Hoon
mjldehoon at yahoo.com
Thu Jan 10 12:24:14 EST 2013
--- On Thu, 1/10/13, Peter Cock <p.j.a.cock at googlemail.com> wrote:
> > Simply calling len(items) does exactly what iterlen
> does, and is much faster too.
>
> No, the reason d'être for iterlen is that you can't use len
> on an iterator, e.g.
>
> >>> len(iter("abcde"))
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: object of type 'iterator' has no len()
>
You're right. Actually it depends on the iterator. For example,
len(xrange(100)) works (xrange also returns an iterator). I guess in general an iterator can't have a len() function because it's not clear that the iterator will ever end.
That said, currently the iterlen function is used in only one place, in Bio/Phylo/BaseTree.py as follows:
def count_terminals(self):
return _utils.iterlen(self.find_clades(terminal=True))
But here you could simply have
def count_terminals(self):
clades = self.find_clades(terminal=True)
count = 0
for clade in clades:
count+=1
return count
I don't see why we need a function iterlen for this, and if we do have such a function, why it should be in Bio._utils.
Best,
-Michiel.
More information about the Biopython-dev
mailing list