> On 2 Dec 2019, at 17:55, Rob Gaddi <rgaddi@highlandtechnology.invalid> wrote:
> 
> On 12/2/19 9:26 AM, Chris Clark wrote:
>> Test case:
>>                import array
>>                array.array('L', [0])
>> # x.itemsize == 8  rather than 4
>> This works fine (returns 4) under Windows Python 3.7.3 64-bit build.
>> Under Ubuntu; Python 2.7.15rc1, 3.6.5, 3.70b3 64-bit this returns 8. 
>> Documentation at https://docs.python.org/3/library/array.html explicitly 
>> states 'L' is for size 4.
>> It impacts all uses types of array (e.g. reading from byte strings).
>> The struct module is a little different:
>> import struct
>> x = struct.pack('L', 0)
>> # len(x) ===8 rather than 4
>> This can be worked around by using '=L' - which is not well documented - so 
>> this maybe a doc issue.
>> Wanted to post here for comments before opening a bug at 
>> https://bugs.python.org/
>> Is anyone seeing this under Debian/Ubuntu?
>> Chris
> 
> I'd say not a bug, at least in array.  Reading that array documentation you 
> linked, 4 is explicitly the MINIMUM size in bytes, not the guaranteed size.

I'm wondering how useful it is that for array you can read from a file but have 
no ideas how many bytes each item needs.
If I have a file with int32_t  in it I cannot from the docs know how to read 
that file into an array.

> 
> The struct situation is, as you said, a bit different.  I believe that with 
> the default native alignment @, you're seeing 4-byte data padded to an 8-byte 
> alignment, not 8-byte data.  That does seem to go against what the struct 
> documentation says, "Padding is only automatically added between successive 
> structure members. No padding is added at the beginning or the end of the 
> encoded struct."

The 'L' in struct is documented for 3.7 to use 4 bytes, but in fact uses 8, on 
fedora 31. Doc bug?

>>> x=struct.pack('L',0x102030405)
>>> x
b'\x05\x04\x03\x02\x01\x00\x00\x00'

Given I have exact control with b, h, i, and q but L is not fixed in size I'm 
not sure how it can be used with certainty across OS and versions.

Barry


> 
> = alignment is documented as having the platform native byte-order, but the 
> size and alignment is standardized as having no padding, which is exactly the 
> behavior you seem to want. The documentation is a bit obtuse and scattered, 
> but no more than any other.
> -- 
> https://mail.python.org/mailman/listinfo/python-list 
> <https://mail.python.org/mailman/listinfo/python-list>
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to