struct.pack bug?

J

Jansson Christer

Hi all,

I have discovered that in my Python 2.4.1 installation (on Solaris 8),
struct.pack handles things in a way that seems inconsistent to me.

I haven't found any comprehensible documentation over known issues with
Python 2.4.1 so I try this...

Here's the thing:
Traceback (most recent call last):
Traceback (most recent call last):

Shouldn't pack('L', -1) raise an exception like the others, rather than
behaving like pack('l', -1)?
Is this fixed in later versions?

(I don't have access to later versions and have failed to install any.
Python 2.5 compiles nicely but "make install" fails without leaving any
clues about how it failed and no installation troubleshooting guides to
be found at python.org. Python 2.4.4 doesn't even compile since it
apparently requires a newer libstdc++ than the one on our system... see
why I'm asking the newsgroup?)

--
 
F

Fredrik Lundh

Jansson Christer said:
I have discovered that in my Python 2.4.1 installation (on Solaris 8),
struct.pack handles things in a way that seems inconsistent to me.

I haven't found any comprehensible documentation over known issues with
Python 2.4.1 so I try this...

Here's the thing:

Traceback (most recent call last):

Traceback (most recent call last):


Shouldn't pack('L', -1) raise an exception like the others, rather than
behaving like pack('l', -1)?

probably; the reason for the old behaviour is probably to simplify for code that
uses Python int's to represent 32-bit values. (mixing longs and ints used to be a
lot more difficult than it is today).
Is this fixed in later versions?

the "struct" module was rewritten in Python 2.5; the new module issues a
warning, and then appears to *clamp* the value to the allowed range, in-
stead of grabbing the low bits:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\Lib\struct.py", line 63, in pack
return o.pack(*args)
struct.error: ubyte format requires 0 <= number <= 255
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\Lib\struct.py", line 63, in pack
return o.pack(*args)
struct.error: short format requires 0 <= number <= USHRT_MAX
__main__:1: DeprecationWarning: 'I' format requires 0 <= number <= 4294967295
'\x00\x00\x00\x00'
__main__:1: DeprecationWarning: 'L' format requires 0 <= number <= 4294967295
'\x00\x00\x00\x00'

</F>
 
J

Jansson Christer

Fredrik said:
:




probably; the reason for the old behaviour is probably to simplify for code that
uses Python int's to represent 32-bit values. (mixing longs and ints used to be a
lot more difficult than it is today).




the "struct" module was rewritten in Python 2.5; the new module issues a
warning, and then appears to *clamp* the value to the allowed range, in-
stead of grabbing the low bits:



Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\Lib\struct.py", line 63, in pack
return o.pack(*args)
struct.error: ubyte format requires 0 <= number <= 255



Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\Lib\struct.py", line 63, in pack
return o.pack(*args)
struct.error: short format requires 0 <= number <= USHRT_MAX



__main__:1: DeprecationWarning: 'I' format requires 0 <= number <= 4294967295
'\x00\x00\x00\x00'



__main__:1: DeprecationWarning: 'L' format requires 0 <= number <= 4294967295
'\x00\x00\x00\x00'

</F>

Ok this implies that somebody is actually thinking about how to handle
this, so I guess I won't file a bug report and simply solve my problems
without relying on those exceptions...

Thank you!
--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,160
Latest member
CollinStri
Top