This is an automated email from the ASF dual-hosted git repository.
astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
The following commit(s) were added to refs/heads/main by this push:
new 34bfd691f PROTON-2881: [Python] More idiomatic use of post 3.9 typing
34bfd691f is described below
commit 34bfd691f4c535f046adf71c9b9aa60d5b83e0aa
Author: Andrew Stitcher <[email protected]>
AuthorDate: Thu Mar 27 21:23:11 2025 -0400
PROTON-2881: [Python] More idiomatic use of post 3.9 typing
---
python/proton/_data.py | 23 ++++++++++++-----------
python/proton/_delivery.py | 20 ++++++++++----------
python/proton/_endpoints.py | 10 +++++-----
python/proton/_handler.py | 6 +++---
python/proton/_handlers.py | 4 ++--
python/proton/_io.py | 4 ++--
python/proton/_message.py | 6 +++---
python/proton/_reactor.py | 35 +++++++++++++++++------------------
python/proton/_transport.py | 6 +++---
python/proton/_utils.py | 10 +++++-----
10 files changed, 62 insertions(+), 62 deletions(-)
diff --git a/python/proton/_data.py b/python/proton/_data.py
index 8ac2c986d..821f296a6 100644
--- a/python/proton/_data.py
+++ b/python/proton/_data.py
@@ -18,7 +18,8 @@
#
import uuid
-from typing import Callable, List, Tuple, Union, Optional, Any, Dict,
Iterable, TypeVar
+from collections.abc import Iterable
+from typing import Callable, Union, Optional, Any, TypeVar
from cproton import PN_ARRAY, PN_BINARY, PN_BOOL, PN_BYTE, PN_CHAR,
PN_DECIMAL128, PN_DECIMAL32, PN_DECIMAL64, \
PN_DESCRIBED, PN_DOUBLE, PN_FLOAT, PN_INT, PN_LIST, PN_LONG, PN_MAP,
PN_NULL, PN_OVERFLOW, PN_SHORT, PN_STRING, \
@@ -45,8 +46,8 @@ unicode = str
_T = TypeVar('_T')
PythonAMQPData = Union[
- Dict['PythonAMQPData', 'PythonAMQPData'],
- List['PythonAMQPData'],
+ dict['PythonAMQPData', 'PythonAMQPData'],
+ list['PythonAMQPData'],
'Described', 'Array', int, str, 'symbol', bytes, float, None]
"""This type annotation represents Python data structures that can be encoded
as AMQP Data"""
@@ -453,7 +454,7 @@ class AnnotationDict(RestrictedKeyDict):
def __init__(
self,
- e: Optional[Union[Dict, List, Tuple, Iterable]] = None,
+ e: Optional[Union[dict, list, tuple, Iterable]] = None,
raise_on_error: bool = True,
**kwargs
) -> None:
@@ -495,7 +496,7 @@ class SymbolList(list):
def __init__(
self,
- t: Optional[List[Any]] = None,
+ t: Optional[list[Any]] = None,
raise_on_error: bool = True
) -> None:
super(SymbolList, self).__init__()
@@ -505,7 +506,7 @@ class SymbolList(list):
else:
self.extend(t)
- def _check_list(self, t: Iterable[Any]) -> List[Any]:
+ def _check_list(self, t: Iterable[Any]) -> list[Any]:
""" Check all items in list are :class:`symbol`s (or are converted to
symbols). """
item = []
if t:
@@ -1144,7 +1145,7 @@ class Data:
"""
return pn_data_get_map(self._data)
- def get_array(self) -> Tuple[int, bool, Optional[int]]:
+ def get_array(self) -> tuple[int, bool, Optional[int]]:
"""
If the current node is an array, return a tuple of the element
count, a boolean indicating whether the array is described, and
@@ -1399,7 +1400,7 @@ class Data:
"""
pn_data_dump(self._data)
- def put_dict(self, d: Dict[Any, Any]) -> None:
+ def put_dict(self, d: dict[Any, Any]) -> None:
"""
A convenience method for encoding the contents of a Python ``dict``
as an AMQP map.
@@ -1416,7 +1417,7 @@ class Data:
finally:
self.exit()
- def get_dict(self) -> Dict[Any, Any]:
+ def get_dict(self) -> dict[Any, Any]:
"""
A convenience method for decoding an AMQP map as a Python ``dict``.
@@ -1436,7 +1437,7 @@ class Data:
self.exit()
return result
- def put_sequence(self, s: List[Any]) -> None:
+ def put_sequence(self, s: list[Any]) -> None:
"""
A convenience method for encoding a Python ``list`` as an
AMQP list.
@@ -1452,7 +1453,7 @@ class Data:
finally:
self.exit()
- def get_sequence(self) -> List[Any]:
+ def get_sequence(self) -> list[Any]:
"""
A convenience method for decoding an AMQP list as a Python ``list``.
diff --git a/python/proton/_delivery.py b/python/proton/_delivery.py
index a4d3f3651..7fbf425e5 100644
--- a/python/proton/_delivery.py
+++ b/python/proton/_delivery.py
@@ -57,7 +57,7 @@ from ._transport import Transport
from ._wrapper import Wrapper
from enum import IntEnum
-from typing import Any, Dict, List, Optional, Union, TYPE_CHECKING
+from typing import Any, Optional, Union, TYPE_CHECKING
if TYPE_CHECKING:
@@ -164,7 +164,7 @@ class RemoteCustomDisposition(RemoteDisposition):
return self._type
@property
- def data(self) -> Optional[List[Any]]:
+ def data(self) -> Optional[Any]:
"""Access the disposition as a :class:`Data` object.
Dispositions are an extension point in the AMQP protocol. The
@@ -245,7 +245,7 @@ class RemoteModifiedDisposition(RemoteDisposition):
return self._undeliverable
@property
- def annotations(self) -> Optional[Dict['symbol', 'PythonAMQPData']]:
+ def annotations(self) -> Optional[dict['symbol', 'PythonAMQPData']]:
return self._annotations
def apply_to(self, local_disposition: 'LocalDisposition'):
@@ -299,11 +299,11 @@ class LocalDisposition(Disposition):
return DispositionType.or_int(pn_disposition_type(self._impl))
@property
- def data(self) -> Optional[List[int]]:
+ def data(self) -> Optional[Any]:
return self._data
@data.setter
- def data(self, obj: List[int]) -> None:
+ def data(self, obj: Any) -> None:
self._data = obj
@property
@@ -347,11 +347,11 @@ class LocalDisposition(Disposition):
pn_disposition_set_undeliverable(self._impl, b)
@property
- def annotations(self) -> Optional[Dict['symbol', 'PythonAMQPData']]:
+ def annotations(self) -> Optional[dict['symbol', 'PythonAMQPData']]:
return self._annotations
@annotations.setter
- def annotations(self, obj: Dict['symbol', 'PythonAMQPData']) -> None:
+ def annotations(self, obj: dict['symbol', 'PythonAMQPData']) -> None:
self._annotations = obj
@@ -426,7 +426,7 @@ class RejectedDisposition(LocalDisposition):
class ModifiedDisposition(LocalDisposition):
def __init__(self, failed: bool = None, undeliverable: bool = None,
- annotations: Optional[Dict['symbol', 'PythonAMQPData']] =
None):
+ annotations: Optional[dict['symbol', 'PythonAMQPData']] =
None):
self._failed = failed
self._undeliverable = undeliverable
self._annotations = annotations
@@ -452,11 +452,11 @@ class ModifiedDisposition(LocalDisposition):
self._undelivered = b
@property
- def annotations(self) -> Optional[Dict['symbol', 'PythonAMQPData']]:
+ def annotations(self) -> Optional[dict['symbol', 'PythonAMQPData']]:
return self._annotations
@annotations.setter
- def annotations(self, obj: Dict['symbol', 'PythonAMQPData']) -> None:
+ def annotations(self, obj: dict['symbol', 'PythonAMQPData']) -> None:
self._annotations = obj
def apply_to(self, local_disposition: LocalDisposition):
diff --git a/python/proton/_endpoints.py b/python/proton/_endpoints.py
index 448d2014d..2559a4dd5 100644
--- a/python/proton/_endpoints.py
+++ b/python/proton/_endpoints.py
@@ -65,7 +65,7 @@ from ._transport import Transport
from ._wrapper import Wrapper
from collections.abc import Iterator
-from typing import Any, Dict, List, Optional, Union, TYPE_CHECKING
+from typing import Any, Optional, Union, TYPE_CHECKING
if TYPE_CHECKING:
from ._condition import Condition
@@ -500,7 +500,7 @@ class Connection(Wrapper, Endpoint):
@offered_capabilities.setter
def offered_capabilities(
self,
- offered_capability_list: Optional[Union['Array', List['symbol'],
SymbolList, List[str]]]
+ offered_capability_list: Optional[Union['Array', list['symbol'],
SymbolList, list[str]]]
) -> None:
self.offered_capabilities_list = SymbolList(offered_capability_list)
@@ -517,7 +517,7 @@ class Connection(Wrapper, Endpoint):
@desired_capabilities.setter
def desired_capabilities(
self,
- desired_capability_list: Optional[Union['Array', List['symbol'],
SymbolList, List[str]]]
+ desired_capability_list: Optional[Union['Array', list['symbol'],
SymbolList, list[str]]]
) -> None:
self.desired_capabilities_list = SymbolList(desired_capability_list)
@@ -533,7 +533,7 @@ class Connection(Wrapper, Endpoint):
return self.properties_dict
@properties.setter
- def properties(self, properties_dict: Optional[Union[PropertyDict,
Dict[str, 'PythonAMQPData']]]) -> None:
+ def properties(self, properties_dict: Optional[Union[PropertyDict,
dict[str, 'PythonAMQPData']]]) -> None:
if isinstance(properties_dict, dict):
self.properties_dict = PropertyDict(properties_dict,
raise_on_error=False)
else:
@@ -1141,7 +1141,7 @@ class Link(Wrapper, Endpoint):
return self._properties_dict
@properties.setter
- def properties(self, properties_dict: Optional[Dict['symbol',
'PythonAMQPData']]) -> None:
+ def properties(self, properties_dict: Optional[dict['symbol',
'PythonAMQPData']]) -> None:
if isinstance(properties_dict, dict):
self._properties_dict = PropertyDict(properties_dict,
raise_on_error=False)
else:
diff --git a/python/proton/_handler.py b/python/proton/_handler.py
index e6d911855..90aec7cdc 100644
--- a/python/proton/_handler.py
+++ b/python/proton/_handler.py
@@ -18,12 +18,12 @@
#
-from typing import Any, Callable, List, Optional, Tuple, Type, Union
+from typing import Any, Callable, Optional, Union
from types import TracebackType
class LazyHandlers(object):
- def __get__(self, obj: 'Handler', clazz: Any) -> Union['LazyHandlers',
List[Any]]:
+ def __get__(self, obj: 'Handler', clazz: Any) -> Union['LazyHandlers',
list[Any]]:
if obj is None:
return self
ret = []
@@ -41,7 +41,7 @@ class Handler(object):
def add(
self,
handler: Any,
- on_error: Optional[Callable[[Tuple[Type[BaseException],
BaseException, 'TracebackType']], None]] = None,
+ on_error: Optional[Callable[[tuple[type[BaseException],
BaseException, TracebackType]], None]] = None,
) -> None:
"""
Add a child handler
diff --git a/python/proton/_handlers.py b/python/proton/_handlers.py
index b225dda34..08096c775 100644
--- a/python/proton/_handlers.py
+++ b/python/proton/_handlers.py
@@ -34,7 +34,7 @@ from ._message import Message
from ._selectable import Selectable
from ._transport import Transport
from ._url import Url
-from typing import Any, List, Optional, Union, TYPE_CHECKING
+from typing import Any, Optional, Union, TYPE_CHECKING
if TYPE_CHECKING:
from ._delivery import DispositionType
@@ -1345,7 +1345,7 @@ class ConnectSelectable(Selectable):
self,
sock: socket.socket,
reactor: 'Container',
- addrs: List[Any],
+ addrs: list[Any],
transport: Transport,
iohandler: IOHandler
) -> None:
diff --git a/python/proton/_io.py b/python/proton/_io.py
index fa814bb49..d33307711 100644
--- a/python/proton/_io.py
+++ b/python/proton/_io.py
@@ -22,7 +22,7 @@ import socket
import select
import time
-from typing import TYPE_CHECKING, Tuple, List
+from typing import TYPE_CHECKING
if TYPE_CHECKING:
from proton._selectable import Selectable
@@ -123,7 +123,7 @@ class IO(object):
self._writing.add(selectable)
self.update_deadline()
- def select(self, timeout: float) -> Tuple[List, List, List]:
+ def select(self, timeout: float) -> tuple[list, list, list]:
def select_inner(timeout):
# This inner select adds the writing fds to the exception fd
set
diff --git a/python/proton/_message.py b/python/proton/_message.py
index 211a54e62..657962d7d 100644
--- a/python/proton/_message.py
+++ b/python/proton/_message.py
@@ -36,7 +36,7 @@ from ._data import char, Data, symbol, ulong, AnnotationDict
from ._endpoints import Link
from ._exceptions import EXCEPTIONS, MessageException
from uuid import UUID
-from typing import Dict, Optional, Union, TYPE_CHECKING, overload
+from typing import Optional, Union, TYPE_CHECKING, overload
if TYPE_CHECKING:
from proton._delivery import Delivery
@@ -447,7 +447,7 @@ class Message(object):
return self.instruction_dict
@instructions.setter
- def instructions(self, instructions: Optional[Dict[Union[str, int],
'PythonAMQPData']]) -> None:
+ def instructions(self, instructions: Optional[dict[Union[str, int],
'PythonAMQPData']]) -> None:
if isinstance(instructions, dict):
self.instruction_dict = AnnotationDict(instructions,
raise_on_error=False)
else:
@@ -468,7 +468,7 @@ class Message(object):
return self.annotation_dict
@annotations.setter
- def annotations(self, annotations: Optional[Dict[Union[str, int],
'PythonAMQPData']]) -> None:
+ def annotations(self, annotations: Optional[dict[Union[str, int],
'PythonAMQPData']]) -> None:
if isinstance(annotations, dict):
self.annotation_dict = AnnotationDict(annotations,
raise_on_error=False)
else:
diff --git a/python/proton/_reactor.py b/python/proton/_reactor.py
index d57543a45..439bcd882 100644
--- a/python/proton/_reactor.py
+++ b/python/proton/_reactor.py
@@ -23,8 +23,9 @@ import logging
import re
import os
import queue
-from typing import Any, Callable, Dict, Iterator, List, Literal, Optional,
Union, TYPE_CHECKING, Tuple, Type
-
+from collections.abc import Iterator
+from types import TracebackType
+from typing import Any, Callable, Literal, Optional, Union, TYPE_CHECKING
import time
import traceback
import uuid
@@ -50,14 +51,12 @@ if TYPE_CHECKING:
from ._data import PythonAMQPData
from ._handlers import TransactionHandler
from socket import socket
- from types import TracebackType
- from uuid import UUID
_logger = logging.getLogger("proton")
-def _generate_uuid() -> 'UUID':
+def _generate_uuid() -> uuid.UUID:
return uuid.uuid4()
@@ -121,11 +120,11 @@ class Reactor(object):
self._handler = Handler()
self._timerheap = []
self._timers = 0
- self.errors: List[Tuple[Type[BaseException], BaseException,
'TracebackType']] = []
+ self.errors: list[tuple[type[BaseException], BaseException,
TracebackType]] = []
for h in handlers:
self.handler.add(h, on_error=self.on_error)
- def on_error(self, info: Tuple[Type[BaseException], BaseException,
'TracebackType']) -> None:
+ def on_error(self, info: tuple[type[BaseException], BaseException,
TracebackType]) -> None:
self.errors.append(info)
self.yield_()
@@ -765,7 +764,7 @@ class Filter(ReceiverOption):
containing the filter name, and the value a filter string.
"""
- def __init__(self, filter_set: Dict[symbol, Described] = {}) -> None:
+ def __init__(self, filter_set: dict[symbol, Described] = {}) -> None:
self.filter_set = filter_set
def apply(self, receiver: 'Receiver') -> None:
@@ -843,7 +842,7 @@ class Copy(ReceiverOption):
def _apply_link_options(
- options: Optional[Union[LinkOption, List[LinkOption]]],
+ options: Optional[Union[LinkOption, list[LinkOption]]],
link: Union['Sender', 'Receiver']
) -> None:
if options:
@@ -978,8 +977,8 @@ class Backoff(object):
def make_backoff_wrapper(
- backoff: Optional[Union[List[Union[float, int]], bool, Backoff]]
-) -> Optional[Union[List[Union[float, int]], bool, Backoff]]:
+ backoff: Optional[Union[list[Union[float, int]], bool, Backoff]]
+) -> Optional[Union[list[Union[float, int]], bool, Backoff]]:
"""
Make a wrapper for a backoff object:
If the object conforms to the old protocol (has reset and next methods)
then
@@ -1003,7 +1002,7 @@ def make_backoff_wrapper(
class Urls(object):
- def __init__(self, values: List[Union[Url, str]]) -> None:
+ def __init__(self, values: list[Union[Url, str]]) -> None:
self.values = [Url(v) for v in values]
def __iter__(self) -> Iterator[Url]:
@@ -1142,7 +1141,7 @@ def _find_config_file() -> Optional[str]:
return None
-def _get_default_config() -> Dict[str, Any]:
+def _get_default_config() -> dict[str, Any]:
conf = os.environ.get('MESSAGING_CONNECT_FILE') or _find_config_file()
if conf and os.path.isfile(conf):
with open(conf, 'r') as f:
@@ -1201,7 +1200,7 @@ class Container(Reactor):
def connect(
self,
url: Optional[Union[str, Url]] = None,
- urls: Optional[List[str]] = None,
+ urls: Optional[list[str]] = None,
address: Optional[str] = None,
handler: Optional[Handler] = None,
reconnect: Union[None, Literal[False], Backoff] = None,
@@ -1343,9 +1342,9 @@ class Container(Reactor):
def _connect(
self,
url: Optional[Union[str, Url]] = None,
- urls: Optional[List[str]] = None,
+ urls: Optional[list[str]] = None,
handler: Optional['Handler'] = None,
- reconnect: Optional[Union[List[Union[float, int]], bool, Backoff]]
= None,
+ reconnect: Optional[Union[list[Union[float, int]], bool, Backoff]]
= None,
heartbeat: None = None,
ssl_domain: Optional[SSLDomain] = None,
**kwargs
@@ -1419,7 +1418,7 @@ class Container(Reactor):
name: Optional[str] = None,
handler: Optional[Handler] = None,
tags: Optional[Callable[[], bytes]] = None,
- options: Optional[Union['SenderOption', List['SenderOption'],
'LinkOption', List['LinkOption']]] = None
+ options: Optional[Union['SenderOption', list['SenderOption'],
'LinkOption', list['LinkOption']]] = None
) -> 'Sender':
"""
Initiates the establishment of a link over which messages can
@@ -1481,7 +1480,7 @@ class Container(Reactor):
name: Optional[str] = None,
dynamic: bool = False,
handler: Optional[Handler] = None,
- options: Optional[Union[ReceiverOption, List[ReceiverOption],
LinkOption, List[LinkOption]]] = None
+ options: Optional[Union[ReceiverOption, list[ReceiverOption],
LinkOption, list[LinkOption]]] = None
) -> 'Receiver':
"""
Initiates the establishment of a link over which messages can
diff --git a/python/proton/_transport.py b/python/proton/_transport.py
index b1cbfa16e..a4e41afbb 100644
--- a/python/proton/_transport.py
+++ b/python/proton/_transport.py
@@ -17,7 +17,7 @@
# under the License.
#
-from typing import Callable, Optional, Type, Union, TYPE_CHECKING, List
+from typing import Callable, Optional, Union, TYPE_CHECKING
from cproton import PN_EOS, PN_SASL_AUTH, PN_SASL_NONE, PN_SASL_OK,
PN_SASL_PERM, PN_SASL_SYS, PN_SASL_TEMP, \
PN_SSL_ANONYMOUS_PEER, PN_SSL_CERT_SUBJECT_CITY_OR_LOCALITY,
PN_SSL_CERT_SUBJECT_COMMON_NAME, \
@@ -634,7 +634,7 @@ class SASL:
else:
return outcome
- def allowed_mechs(self, mechs: Union[str, List[str]]) -> None:
+ def allowed_mechs(self, mechs: Union[str, list[str]]) -> None:
"""
SASL mechanisms that are to be considered for authentication.
@@ -862,7 +862,7 @@ class SSL(object):
return err
def __new__(
- cls: Type['SSL'],
+ cls: type['SSL'],
transport: Transport,
domain: SSLDomain,
session_details: Optional['SSLSessionDetails'] = None
diff --git a/python/proton/_utils.py b/python/proton/_utils.py
index 65023c8ef..1ef79d6b5 100644
--- a/python/proton/_utils.py
+++ b/python/proton/_utils.py
@@ -30,7 +30,7 @@ from ._url import Url
from ._reactor import Container
from ._handlers import MessagingHandler, IncomingMessageHandler
-from typing import Callable, Optional, Literal, Union, TYPE_CHECKING, List, Any
+from typing import Callable, Optional, Literal, Union, TYPE_CHECKING, Any
if TYPE_CHECKING:
from ._delivery import DispositionType
@@ -111,7 +111,7 @@ class BlockingSender(BlockingLink):
self,
msg: 'Message',
timeout: Union[None, Literal[False], float] = False,
- error_states: Optional[List['DispositionType']] = None,
+ error_states: Optional[list['DispositionType']] = None,
) -> Delivery:
"""
Blocking send which will return only when the send is complete
@@ -361,7 +361,7 @@ class BlockingConnection(Handler):
container: Optional[Container] = None,
ssl_domain: Optional['SSLDomain'] = None,
heartbeat: Optional[float] = None,
- urls: Optional[List[str]] = None,
+ urls: Optional[list[str]] = None,
reconnect: Union[None, Literal[False], 'Backoff'] = None,
**kwargs
) -> None:
@@ -392,7 +392,7 @@ class BlockingConnection(Handler):
address: Optional[str],
handler: Optional[Handler] = None,
name: Optional[str] = None,
- options: Optional[Union['SenderOption', List['SenderOption'],
'LinkOption', List['LinkOption']]] = None
+ options: Optional[Union['SenderOption', list['SenderOption'],
'LinkOption', list['LinkOption']]] = None
) -> BlockingSender:
"""
Create a blocking sender.
@@ -413,7 +413,7 @@ class BlockingConnection(Handler):
dynamic: bool = False,
handler: Optional[Handler] = None,
name: Optional[str] = None,
- options: Optional[Union['ReceiverOption', List['ReceiverOption'],
'LinkOption', List['LinkOption']]] = None
+ options: Optional[Union['ReceiverOption', list['ReceiverOption'],
'LinkOption', list['LinkOption']]] = None
) -> BlockingReceiver:
"""
Create a blocking receiver.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]