You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by GitBox <gi...@apache.org> on 2019/09/26 21:16:37 UTC
[GitHub] [qpid-proton] kpvdr opened a new pull request #192: ENTMQCL-1361: Changed Python API to better handle strings where symbo…
kpvdr opened a new pull request #192: ENTMQCL-1361: Changed Python API to better handle strings where symbo…
URL: https://github.com/apache/qpid-proton/pull/192
Exception characteristics for API symbol changes
================================================
* Old behavior is not changed. If the old API accepted non-symbol or non-string
keys and/or values, so will the updated API.
* Strings are silently converted to symbols. Where the old API accepted strings, the
new API will convert them to symbol objects.
* Three new classes have been added to _data:
* AnnotationDict, which accepts only symbol and ulong keys. However, if string keys
are provided, they will be converted to symbols.
* PropertyDict, which accepts only symbol keys. However, if string keys are provided,
they will be converted to symbols.
* SymbolList, which accepts only symbol elements. However, if string elements are
provided, they will be converted to symbols.
* These three classes by default raise exceptions for non-allowed types:
AnnotationDict: KeyError
PropertyDict: KeyError
SymbolList: TypeError
However, each of these may be forced to accept non-allowed types by using the
throw=False keyword arg in the constructor of each of these types.
* The idea is to encourage the use of these types for all places in the API where
restricted key or list types are required by the AMQP specification:
API property | Recommended class | Allowed type(s)
------------------|------------------------------|---------------------------
Message.annotations | AnnotationDict | symbol, string(*), ulong
Connection.offered_capabilities | SymbolList | symbol, string(*)
Connection.desired_capabilities | SymbolList | symbol, string(*)
Connection.properties | PropertyDict | symbol, string(*)
(*) will be converted into a symbol
By default, they will enforce the correct type, and will raise an error if a
non-allowed type is used on construction.
Example:
```
>>> from proton import symbol, Array, SymbolList
>>> from proton.reactor import Container
>>> from proton.handlers import MessagingHandler
>>> h = MessagingHandler()
>>> c = Container(h)
```
By default, non-allowed types are ignored, but strings are converted to symbols:
```
>>> c.connect(offered_capabilities=['one', symbol('two'), 3]).offered_capabilities
SymbolList([symbol('one'), symbol('two'), 3])
```
but by using a SymbolList object as the value, the default behavior will be to
enforce non-allowed types:
```
>>> c.connect(offered_capabilities=SymbolList(['one', symbol('two'), 3])).offered_capabilities
...
TypeError: Non-symbol type <class 'int'>: 3
```
Also, previously used patterns are still supported:
```
>>> c.connect(offered_capabilities=Array(UNDESCRIBED, Data.SYMBOL, symbol('one'), symbol('two'))).offered_capabilities
Array(UNDESCRIBED, 21, symbol('one'), symbol('two'))
```
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@qpid.apache.org
For additional commands, e-mail: dev-help@qpid.apache.org