[Python-ideas] Direct byte<->int conversions (was Re: bitwise operations on bytes)
Alexandre Vassalotti
alexandre at peadrop.com
Sat Aug 15 18:34:47 CEST 2009
On Sat, Aug 15, 2009 at 8:14 AM, Mark Dickinson<dickinsm at gmail.com> wrote:
> I'm not convinced that it's valuable to a have a variable-size
> version of this; I'd make size a required argument.
>
> The problem with the variable size version is that the choice of
> byte-length for the output for a given integer input is a little bit
> arbitrary. For a particular requirement (producing code to conform
> with some existing serialization protocol, for example) it seems
> likely that the choice Python makes will disagree with what's
> required by that protocol, so that size still has to be given explicitly.
> On the other hand, if a user just wants a quick and easy way
> to serialize ints, without caring about the exact form of the
> serialization, then there are number of solutions already
> available within Python.
>
Well, the only use-case in the standard library I found (i.e.,
simplifying encode_long() and decode_long() in pickle.py) needed the
variable-length version. However, unlike I originally thought, the
variable length version is not difficult to emulate using
`int.bit_length()`. For example, with my patch I can rewrite:
def encode_long(x):
if x == 0:
return b""
return x.as_bytes(little_endian=True)
as:
def encode_long(x)
if x == 0:
return b""
nbytes = (x.bit_length() >> 3) + 1
result = x.as_bytes(nbytes, little_endian=True)
if x < 0 and nbytes > 1:
if result[-1] == 0xff and (result[-2] & 0x80) != 0:
result = result[:-1]
return result
I usually hate with passion APIs that requires you to know the length
of the result in advance. But this doesn't look bad. The only use-case
for the variable-length version I have is the encode_long() function
in pickle.py. In addition, it sounds reasonable to leave the duty of
long serialization to pickle.
So, +1 from me.
-- Alexandre
More information about the Python-ideas
mailing list