repr/str diff between Python 2 and 3
Terry Reedy
tjreedy at udel.edu
Tue Oct 11 21:46:40 EDT 2016
On 10/11/2016 8:59 PM, Skip Montanaro wrote:
> I'm trying to port some code from Python 2 to 3, and beyond the usual
> mechanical stuff, I've encountered a difference between the str() of
> floats. Here's an example. In Python 3 I get:
>
>>>> print(repr(27.04 - 0.01))
> 27.029999999999998
>>>> print(str(27.04 - 0.01))
> 27.029999999999998
>
> but in Python 2 str() behaves differently:
>
>>>> print repr(27.04 - 0.01)
> 27.029999999999998
>>>> print str(27.04 - 0.01)
> 27.03
>
> My test case writes through a csv writer, which writes the str() of each
> element to the output. My test assertions are looking at the output, not
> the numeric input, so the option to test if the number is "close enough"
> isn't readily available. I suppose I should adjust my test case, as in this
> case 27.04-0.01 is different than 27.03.
Or you can make the text version-specific.
Basing tests on strings generated by Python is fragile because they are
subject to change. For instance, 3.1 has a new algorithm for
repr(float), discussed in What's New in 3.1. The repr for other objects
can and does change with new versions, as to exception messages. (They
are only changed in bugfix releases if there is a real and significant
but.)
> Is there documentation of this particular change? My searching turned up
> documentation of plenty of other changes, but not this particular one.
There was discussed on the development lists. I believe this change was
in 3.0, in which case there would be no mention in the 3.x docs. I did
not see mention in What New in 3.0, though. The change would certainly
be in the NEWS file that lists all commits. This is now reformatted
into an html changelog linked from What's New, but this started after in
3.0.
--
Terry Jan Reedy
More information about the Python-list
mailing list