[Python-Dev] struct module and coercing floats to integers

Bob Ippolito bob at redivi.com
Fri Jul 28 22:35:40 CEST 2006


It seems that the pre-2.5 struct module has some additional  
undocumented behavior[1] that didn't percolate into the new version:  
http://python.org/sf/1530559

Python 2.4 and previous will coerce floats to integers when necessary  
as such without any kind of complaint:

$ python2.4 -c "import struct; print repr(struct.pack('>H',  
0.9999999999999999))"
'\x00\x00'

Python 2.5 refuses to coerce float to int:

$ python2.5 -c "import struct; print repr(struct.pack('>H',  
0.9999999999999999))"
Traceback (most recent call last):
   File "<string>", line 1, in <module>
   File "/Users/bob/src/python/Lib/struct.py", line 63, in pack
     return o.pack(*args)
TypeError: unsupported operand type(s) for &: 'float' and 'long'

The available options are to:

1. Reinstate the pre-2.5 weirdness
2. Reinstate the pre-2.5 weirdness with a DeprecationWarning
3. Break existing code that relies on undocumented behavior (seems  
more like a bug than lack of specification)

Either 2 or 3 seems reasonable to me, with a preference for 3 because  
none of my code depends on old bugs in the struct module :)

As far as precedent goes, the array module *used* to coerce floats  
silently, but it's had a DeprecationWarning since at least Python 2.3  
(but perhaps even earlier). Maybe it's time to promote that warning  
to an exception for Python 2.5?

[1] The pre-2.5 behavior should really be considered a bug, the  
documentation says "Return a string containing the values v1, v2, ...  
packed according to the given format. The arguments must match the  
values required by the format exactly." I wouldn't consider arbitrary  
floating point numbers to match the value required by an integer  
format exactly. Floats are not in general interchangeable with  
integers in Python anyway (e.g. list indexes, etc.).

-bob



More information about the Python-Dev mailing list