On 19/01/17 20:54, Cameron Simpson wrote:
> On 19Jan2017 16:04, Yury Selivanov <yselivanov...@gmail.com> wrote:
>> This is a neat idea, but this will only work for parsing framed
>> binary protocols.  For example, if you protocol prefixes all packets
>> with a length field, you can write an efficient read buffer and
>> use your proposal to decode all of message's fields in one shot.
>> Which is good.
>>
>> Not all protocols use framing though.  For instance, your proposal
>> won't help to write Thrift or Postgres protocols parsers.
> 
> Sure, but a lot of things fit the proposal. Seems a win: both simple and
> useful.
> 
>> Overall, I'm not sure that this is worth the hassle.  With proposal:
>>
>>   data, = struct.unpack('!H$', buf)
>>   buf = buf[2+len(data):]
>>
>> with the current struct module:
>>
>>   len, = struct.unpack('!H', buf)
>>   data = buf[2:2+len]
>>   buf = buf[2+len:]
>>
>> Another thing: struct.calcsize won't work with structs that use
>> variable length fields.
> 
> True, but it would be enough for it to raise an exception of some kind.
> It won't break any in play code, and it will prevent accidents for users
> of new variable sizes formats.
> 
> We've all got things we wish struct might cover (I have a few, but
> strangely the top of the list is nonsemantic: I wish it let me put
> meaningless whitespace inside the format for readability).
> 
> +1 on the proposal from me.
> 
> Oh: subject to one proviso: reading a struct will need to return how
> many bytes of input data were scanned, not merely returning the decoded
> values.

This is a little difficult without breaking backwards compatibility,
but, it is not difficult to compute the lengths yourself. That said,
calcsize could require an extra parameter if given a format string with
variable-length specifiers in it, e.g.:

  struct.calcsize("z", (b'test'))

Would return 5 (zero-length terminator), so you don't have to compute it
yourself.

Also, I filed a bug, and proposed use of Z and z.

> 
> Cheers,
> Cameron Simpson <c...@zip.com.au>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to