diff --git a/CHANGES/11085.misc.rst b/CHANGES/11085.misc.rst new file mode 100644 index 00000000000..67b1915cfcb --- /dev/null +++ b/CHANGES/11085.misc.rst @@ -0,0 +1 @@ +Improved performance of isinstance checks by using collections.abc types instead of typing module equivalents -- by :user:`bdraco`. diff --git a/aiohttp/client_reqrep.py b/aiohttp/client_reqrep.py index 972c32969fd..de62f94da84 100644 --- a/aiohttp/client_reqrep.py +++ b/aiohttp/client_reqrep.py @@ -7,6 +7,7 @@ import sys import traceback import warnings +from collections.abc import Mapping as ABCMapping from hashlib import md5, sha1, sha256 from http.cookies import CookieError, Morsel, SimpleCookie from types import MappingProxyType, TracebackType @@ -18,7 +19,6 @@ Iterable, List, Literal, - Mapping, NamedTuple, Optional, Tuple, @@ -1006,7 +1006,7 @@ def update_cookies(self, cookies: Optional[LooseCookies]) -> None: c.load(self.headers.get(hdrs.COOKIE, "")) del self.headers[hdrs.COOKIE] - if isinstance(cookies, Mapping): + if isinstance(cookies, ABCMapping): iter_cookies = cookies.items() else: iter_cookies = cookies # type: ignore[assignment] diff --git a/aiohttp/cookiejar.py b/aiohttp/cookiejar.py index 1e286dffed2..d337944751f 100644 --- a/aiohttp/cookiejar.py +++ b/aiohttp/cookiejar.py @@ -10,6 +10,7 @@ import time import warnings from collections import defaultdict +from collections.abc import Mapping as ABCMapping from http.cookies import BaseCookie, Morsel, SimpleCookie from typing import ( DefaultDict, @@ -18,7 +19,6 @@ Iterable, Iterator, List, - Mapping, Optional, Set, Tuple, @@ -237,7 +237,7 @@ def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> No # Don't accept cookies from IPs return - if isinstance(cookies, Mapping): + if isinstance(cookies, ABCMapping): cookies = cookies.items() for name, cookie in cookies: diff --git a/aiohttp/multipart.py b/aiohttp/multipart.py index fe5499e1144..c32eb4eb122 100644 --- a/aiohttp/multipart.py +++ b/aiohttp/multipart.py @@ -6,6 +6,7 @@ import uuid import warnings from collections import deque +from collections.abc import Mapping as ABCMapping, Sequence as ABCSequence from types import TracebackType from typing import ( TYPE_CHECKING, @@ -957,12 +958,12 @@ def append_form( headers: Optional[Mapping[str, str]] = None, ) -> Payload: """Helper to append form urlencoded part.""" - assert isinstance(obj, (Sequence, Mapping)) + assert isinstance(obj, (ABCSequence, ABCMapping)) if headers is None: headers = CIMultiDict() - if isinstance(obj, Mapping): + if isinstance(obj, ABCMapping): obj = list(obj.items()) data = urlencode(obj, doseq=True) diff --git a/aiohttp/payload.py b/aiohttp/payload.py index dbe12ed639c..de12c758157 100644 --- a/aiohttp/payload.py +++ b/aiohttp/payload.py @@ -7,6 +7,7 @@ import sys import warnings from abc import ABC, abstractmethod +from collections.abc import Iterable as ABCIterable from itertools import chain from typing import ( IO, @@ -137,7 +138,7 @@ def register( self._first.append((factory, type)) elif order is Order.normal: self._normal.append((factory, type)) - if isinstance(type, Iterable): + if isinstance(type, ABCIterable): for t in type: self._normal_lookup[t] = factory else: