Bruno Rijsman created THRIFT-4651: ------------------------------------- Summary: 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
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)