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

Steven D'Aprano steve at pearwood.info
Tue May 1 09:09:19 EDT 2018


On Tue, May 01, 2018 at 07:22:52PM +0800, Ken Hilton wrote:

> The only way to get 493182234161465432041076 out of b'hovercraft'

You seem to be using a bytes object as a base-256 number. Under what 
circumstances is this desirable?


> in a single expression is as follows:

What's so special about this operation that it needs to be a single 
expression? The easy way to do this is:

from functools import reduce  # not needed in Python 2
reduce(lambda m, n: m*256 + n, b'hovercraft', 0)

Do the import once at the top of your module, and then you can call 
reduce as many times as you like.

If you really, really, really want to make it a one-liner, perhaps to 
win a bet, or because the Enter key on your keyboard is broken, then you 
can use the __import__('functools') trick.

__import__('functools').reduce(lambda m, n: m*256 + n, b'hovercraft', 0)

But don't do that.


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

'(i for i in a)' is best written as 'iter(a)' if you must have an 
iterator, or just 'a' if you don't care what sort of iterable it is.


> 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?

I don't even know why you would want to do it in the first place, let 
alone why you think it is special enough to dedicate syntax to doing it.




-- 
Steve


More information about the Python-ideas mailing list