You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Bruno Rijsman (JIRA)" <ji...@apache.org> on 2018/10/16 22:07:00 UTC

[jira] [Closed] (THRIFT-4651) Thrift Python encodes and decodes a Thrift list<...> into a Python set

     [ https://issues.apache.org/jira/browse/THRIFT-4651?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Bruno Rijsman closed THRIFT-4651.
---------------------------------
    Resolution: Invalid

Sorry, my mistake. Was looking at the wrong encoding routing. There was one message type where headers was a list and another one where it was a set.

> Thrift Python encodes and decodes a Thrift list<...> into a Python set
> ----------------------------------------------------------------------
>
>                 Key: THRIFT-4651
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4651
>             Project: Thrift
>          Issue Type: Bug
>          Components: Python - Compiler
>    Affects Versions: 1.0
>            Reporter: Bruno Rijsman
>            Priority: Major
>
> have a Thrift structure which contains a field "headers" which is a list<...> :
> {{/** A TIDE with sorted TIE headers, if headers unsorted, behavior is undefined */}}
> {{ struct TIDEPacket {}}
> {{ /** all 00s marks starts */}}
> {{ 1: required TIEID start_range;}}
> {{ /** all FFs mark end */}}
> {{ 2: required TIEID end_range;}}
> {{ /** _sorted_ list of headers */}}
> {{ 3: required list<TIEHeader> headers; /* <<<<<< */}}
> {{ }}}
> This struct is actually deeply nested inside another structure, but that doesn't matter for the bug.
> When I encode the message, I pass a Python LIST into the Thrift-compiler generated encoding functions:
> {{... TIREPacket(headers=[TIEHeader(seq_nr=0, origination_lifetime=None, tieid=TIEID(direction=2, tietype=2, originator=2, tie_nr=2), origination_time=None, remaining_lifetime=0)]) ...}}
> Note the square bracket [ after headers=
> When I decode that encoded message using the Thrift-compiler generated Python decoding functions, it decodes it as a Python SET instead of a Pythin list:
> {{... TIREPacket(headers=\{TIEHeader(seq_nr=0, origination_lifetime=None, tieid=TIEID(direction=2, tietype=2, originator=2, tie_nr=2), origination_time=None, remaining_lifetime=0)}) ...}}
> Note the curly bracket { after headers=
> Indeed, when I look at the source code of the Python encoding/decoding functions generated by the Thrift compiler, I can see that the list<...> is treated as a SET:
> {{class TIREPacket(object):}}
> {{ """}}
> {{ A TIRE packet}}{{Attributes:}}
> {{ - headers}}
> {{ """}}{{thrift_spec = (}}
> {{ None, # 0}}
> {{ (1, TType.SET, 'headers', (TType.STRUCT, (TIEHeader, TIEHeader.thrift_spec), False), None, ), # 1}}
> {{ )}}
> You might wonder why the code did not crash when I passed a Python list to the encoding function instead of a set.
> It is probably because iterating over a list looks exactly the same as iterating over a set.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)