[Python-Dev] struct module and coercing floats to integers (original) (raw)

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 "", line 1, in 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