On Mon, May 4, 2009 at 11:01 AM, Robert Bradshaw
<rober...@math.washington.edu> wrote:
>
> On May 4, 2009, at 10:53 AM, William Stein wrote:
>
>> On Mon, May 4, 2009 at 10:45 AM, kcrisman <kcris...@gmail.com> wrote:
>>>
>>> Dear support,
>>>
>>> I assume this is known, but I am wondering whether it should be
>>> treated as a bug,
>>
>> This is not a bug.  It's a stupid design decision in Python, which we
>> have to live with until we switch to Python 3.0 or switch to doing
>> "from __future__ import division":
>>
>> sage: from __future__ import division
>> sage: len([2,2])/len([2,3,4])
>> 0.66666666666666663
>
> And I'm not a fan of this behavior either, but in many ways it's less
> surprising than 0.

I also don't like it either, but it is *massively* better than getting 0.

>
>>
>>
>>> or whether someone using len() on lists should be
>>> assumed to know it might then be operated on with Python /, not
>>> Sage /, as opposed to the preparser catching this sort of thing.
>>>
>>> sage: len([2,2])/len([2,3,4])
>>> 0
>>>
>>> Thanks for any suggestions on what to do with this - right now I have
>>> to do
>>>
>>> sage: Integer(len([2,2]))/Integer(len([2,3,4]))
>>> 2/3
>>
>> Trust me, I understand that Python's int floor division sucks.   I'm
>> teaching undergrads about stats using Sage now, and the most obvious
>> line of code to compute the mean of a list gets the answer totally
>> wrong because of this problem.  This already caused a lot of
>> confusion.
>>
>> This is definitely not something that should be addressed by the
>> preparser.  It could be addressed by rewriting len, but I'm very
>> hesitant to do that, because it will introduce subtle bugs when moving
>> code from preparsed to the library (.py files).
>> The way one might rewrite len would be:
>>
>> sage: import __builtin__
>> sage: len = lambda x: Integer(__builtin__.len(x))
>> sage: len([2,2])/len([2,3,4])
>> 2/3
>
> Good point, I hadn't though about that. We could introduce a size()
> or cardinality() method that returns an Integer, or possibly infinity.

We could also redefine len.    Can you think of any problems this will
cause *besides* when moving code from .sage preparsed files to Python
in the Sage library?    I can't think of any.

 -- William

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to