[Python-ideas] A way to subscript a single integer from bytes

Ken Hilton kenlhilton at gmail.com
Tue May 1 07:22:52 EDT 2018


Hi all,

So I'm pretty sure everyone here is familiar with how the "bytes" object
works in Python 3. It acts mostly like a string, with the exception that
0-dimensional subscripting (var[idx]) returns an integer, not a bytes
object - the integer being the ordinal number of the corresponding
character.
However, 1-dimensional subscripting (var[idx1:idx2]) returns a bytes
object. Example:

    >>> a = b'hovercraft'
    >>> a[0]
    104
    >>> a[4:8]
    b'rcra'

Though this isn't exactly unexpected behavior (it's not possible to
accidentally do 1-dimensional subscripting and expect an integer it's a
different syntax), it's still a shame that it isn't possible to quickly and
easily subscript an integer out of it. Following up from the previous
example, The only way to get 493182234161465432041076 out of b'hovercraft'
in a single expression is as follows:

    list(__import__('itertools').accumulate((i for i in a), lambda x, y: (x
<< 8) + y))[-1]

Now, I'm not proposing changing the 1-dimensional subscripting syntax to
return an integer - that would be backwards incompatible, tsk tsk! No,
instead, I'm simply suggesting a method of bytes objects, which would do
something like this (assume the method is called "subint"):

    >>> a = b'hovercraft'
    >>> a.subint(0, -1) # -1 is equivalent to len(a)
    493182234161465432041076

Much as I would think that such subscripting would deserve special syntax
(perhaps bytes{idx1:idx2}), I don't think this special case is special
enough to break the rules. So I'm sticking with the method idea.

What are your thoughts?

Sincerely,
Ken;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180501/bd797487/attachment-0001.html>


More information about the Python-ideas mailing list