On Wed, Dec 4, 2019 at 4:16 PM Chris Clark <chris.cl...@actian.com> wrote:
> I think the consensus from the various threads is that the docs are either 
> lacking or misleading.
>
> I mentioned that this impacts bytes and the problem there is more telling as 
> it hard fails (this is how I first discovered this was an issue):
>
>     >>> array.array('L', b'\0\0\0\0')
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in <module>
>     ValueError: string length not a multiple of item size
>
> I don't believe the documentation is accurate by using the word "minimum". 
> Minimum would suggest that it would accept a 4-byte value as a minimum and on 
> 64-bit it does *not*, it hard fails. If it were to document that, "the sizes 
> are native integer types for the platform, the table documents some typical 
> but *not* guaranteed sizes", that would be more clear.
>

I think array.array() is possibly the wrong tool for this job. If you
have a collection of bytes from some well-defined source (eg you're
parsing a file in a known format), struct is better suited to it,
because it's easy to define both the size and byte order.

> For my uses case I'm seriously thinking about not using array moving forward 
> and only using struct. I briefly wondered about ctypes (it has nice names, 
> e.g. c_int64 that are unambiguous) but then I remembered it is not available 
> in Jython).
>

I wouldn't bother with ctypes for this type of job.

> Regarding Barry's comment, yep size consistency with array is a pain - what I 
> implemented as workaround is below (and likely to be my solution going 
> forward):
>
>     x = array.array('L', [0])
>     if x.itemsize == 4:
>         FMT_ARRAY_4BYTE = 'L'
>         FMT_STRUCT_4BYTE = '<L'
>     else:
>         x = array.array('I', [0])
>         if x.itemsize == 4:
>             FMT_ARRAY_4BYTE = 'I'
>             FMT_STRUCT_4BYTE = '<L'
>     del(x)
>
> and then use the constants in array/struct calls where (binary) file IO is 
> happening.

Yep, looks like struct is the way to go here. (Especially since you
don't have a final 'else'.)

ChrisA
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to