On 2012-11-08, Nils Bruin <nbr...@sfu.ca> wrote:
> On Nov 8, 1:17 pm, Simon King <simon.k...@uni-jena.de> wrote:
>> Hi Volker,
>>
>> On 2012-11-08, Volker Braun <vbraun.n...@gmail.com> wrote:
>>
>> > But then you'd always have to write a lot of
>> > boilerplate to return an iterator. Its much easier to use yield, but then
>> > you can't return any additional information about finiteness.
>>
>> No? What's wrong with __len__?
>
> There are iterators where you do know the result is finite but where
> it is hard to predict how many items will be returned, e.g.
>
> ( x for x in range(1000) if expensive_predicate(x) ).
>
> It would be silly to run through this iterable twice: once to get the
> length and establish it's finite and once to actually sum the entries.
> Would you just test for the existence of __len__ ? [On this example it
> actually fails because a generator object doesn't have a __len__
> attribute.

My suggestion was that the sum() method (and the prod() method as well)
do things like
    def sum(self, L):
        try:
            n = len(L)
        except:
            raise ValueError, "the given input is not a finite iterable"
        if n not in ZZ:
            raise ValueError, "the given input is not a finite iterable"
        <do the usual summation and return the result>

For V = QQ^3, an error would be raised on V.sum(V), simply because len(V)
raises an error. Similarly for V = ZZ.

For V = GF(5)^3, V.sum(V) would return the sum of all elements, because
len(V) is finite and V is iterable.

And from the implementation point of view, I guess if P is an iterable
parent (i.e., someone was able to implement __iter__), then usually it
would also be possible to tell the cardinality of P. There are parents
that have a method called cardinality() - why not make __len__ an alias
for the cardinality?

Best regards,
Simon


-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To post to this group, send email to sage-devel@googlegroups.com.
To unsubscribe from this group, send email to 
sage-devel+unsubscr...@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel?hl=en.


Reply via email to