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 <astitc...@apache.org>
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: commits-unsubscr...@qpid.apache.org
For additional commands, e-mail: commits-h...@qpid.apache.org

Reply via email to