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