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

Kim van der Riet updated PROTON-1835:
-------------------------------------
    Description: 
The AMQP map (expressed as a list) {{[binary(123), "hello", decimal128(123), 
"world"]}} cannot be implemented in Python using the {{dict}} type. This 
happens because {{proton.decimal}} is derived from {{bytes}}, and the 
dictionary treats the keys as the same value and causes the first value to be 
overwritten by the second:
{noformat}
>>> import proton
>>> {b'123': 'hello', proton.decimal128(b'123'): 'world'}
{'123': 'world'}
{noformat}
Using the {{[]}} operator to add the values one at a time to an empty {{dict}} 
results in the same outcome. Even using related classes (ie both derived from a 
common parent) don't work:
{noformat}
>>> import proton
>>> class mybin(bytes):
...     def __repr__(self):
...         return 'mybin(%s)' % bytes.__repr__(self)
... 
>>> {mybin(b'123'): 'hello', proton.decimal128(b'123'): 'world'}
{mybin('123'): 'world'}
{noformat}
This issue highlights that the Python {{dict}} type is not suitable for 
representing AMQP maps. In addition, dicts do not guarantee ordering of the 
elements (although other Python classes such as {{collections.OrderedDict}} 
do). Solving this issue will probably require re-implementing the way AMQP maps 
are represented.

  was:
The AMQP map (expressed as a list) {{[binary(123), "hello", decimal128(123), 
"world"]}} cannot be implemented in Python using the {{dict}} type. This 
happens because {{proton.decimal}} is derived from {{bytes}}, and the 
dictionary treats the keys as the same value and causes the first value to be 
overwritten by the second:
{noformat}
>>> import proton
>>> {b'123': 'hello', proton.decimal128(b'123'): 'world'}
{'123': 'world'}
{noformat}
Using the {{[]}} operator to add the values one at a time to an empty {{dict}} 
results in the same outcome. Even using related classes (ie both derived from a 
common parent) don't work:
{noformat}
>>> import proton
>>> class mybin(bytes):
...     def __repr__(self):
...         return 'mybin(%s)' % bytes.__repr__(self)
... 
>>> {mybin(b'123'): 'hello', proton.decimal128(b'123'): 'world'}
{mybin('123'): 'world'}
{noformat}
This issue highlights that the Python {{dict}} type is not suitable for 
representing AMQP maps. In addition, {{dict}}s do not guarantee ordering of the 
elements (although other Python classes such as {{collections.OrderedDict}} 
do). Solving this issue will probably require re-implementing the way AMQP maps 
are represented.


> [Python binding] Use of Python dict for AMQP maps does not allow derived or 
> related keys of the same value
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: PROTON-1835
>                 URL: https://issues.apache.org/jira/browse/PROTON-1835
>             Project: Qpid Proton
>          Issue Type: Bug
>          Components: python-binding
>            Reporter: Kim van der Riet
>            Priority: Major
>
> The AMQP map (expressed as a list) {{[binary(123), "hello", decimal128(123), 
> "world"]}} cannot be implemented in Python using the {{dict}} type. This 
> happens because {{proton.decimal}} is derived from {{bytes}}, and the 
> dictionary treats the keys as the same value and causes the first value to be 
> overwritten by the second:
> {noformat}
> >>> import proton
> >>> {b'123': 'hello', proton.decimal128(b'123'): 'world'}
> {'123': 'world'}
> {noformat}
> Using the {{[]}} operator to add the values one at a time to an empty 
> {{dict}} results in the same outcome. Even using related classes (ie both 
> derived from a common parent) don't work:
> {noformat}
> >>> import proton
> >>> class mybin(bytes):
> ...     def __repr__(self):
> ...         return 'mybin(%s)' % bytes.__repr__(self)
> ... 
> >>> {mybin(b'123'): 'hello', proton.decimal128(b'123'): 'world'}
> {mybin('123'): 'world'}
> {noformat}
> This issue highlights that the Python {{dict}} type is not suitable for 
> representing AMQP maps. In addition, dicts do not guarantee ordering of the 
> elements (although other Python classes such as {{collections.OrderedDict}} 
> do). Solving this issue will probably require re-implementing the way AMQP 
> maps are represented.



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to