From 03f4dd0884a5014872e8ca077ce54c5ff6577f4b Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Tue, 20 Sep 2022 18:52:36 +0200 Subject: [PATCH] [PR #6923/78fa0401 backport][3.9] Exclude the `object` possibility from the `ClientSession.timeout` type (#6924) **This is a backport of PR #6923 as merged into master (78fa04019c49e87f352d89e000963c16af78cae1).** ## What do these changes do? This is a follow-up PR to #6917, which fixes the overly inclusive typing of `ClientSession.timeout` attribute, which can never actually end up as an `object` instance. This leftover probably exists from the time when there was the `_sentinel` value being assigned to the attribute (see "3.8 branch `self._timeout` assignment" from the linked issue), hence why it ended up this way. ## Are there changes in behavior for the user? For untyped code, there's absolutely no change - the `self._timeout` attribute was never actually assigned the sentinel value to. Most of the explanation already exists in #6917, here's the test code snippet from there again: ```py import asyncio import aiohttp async def main: session = aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=10)) # read back the total time attribute total_time = session.timeout.total # "object" type of "Union[object, ClientTimeout]" has no attribute "total" print(total_time) asyncio.run(main()) ``` For typed code, the current solution would be to `assert isinstance(session.timeout, aiohttp.ClientTimeout)` everywhere the attribute is being accessed. This PR removes this "unnecessary necessity". ## Related issue number #6917 ## Checklist - [x] I think the code is well written - [ ] Unit tests for the changes exist - [x] Documentation reflects the changes (documentation never mentioned an `object` instance being accessible from there even) - [ ] If you provide code modification, please add yourself to `CONTRIBUTORS.txt` * The format is <Name> <Surname>. * Please keep alphabetical order, the file is sorted by names. - [ ] Add a new news fragment into the `CHANGES` folder * name it `.` for example (588.bugfix) * if you don't have an `issue_id` change it to the pr id after creating the pr * ensure type is one of the following: * `.feature`: Signifying a new feature. * `.bugfix`: Signifying a bug fix. * `.doc`: Signifying a documentation improvement. * `.removal`: Signifying a deprecation or removal of public API. * `.misc`: A ticket has been closed, but it is not of interest to users. * Make sure to use full sentences with correct case and punctuation, for example: "Fix issue with non-ascii contents in doctest text files." Co-authored-by: DevilXD --- CHANGES/6917.bugfix | 3 +++ CHANGES/6917.doc | 1 + CHANGES/6923.bugfix | 1 + CHANGES/6923.doc | 1 + aiohttp/client.py | 2 +- 5 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 CHANGES/6917.bugfix create mode 120000 CHANGES/6917.doc create mode 120000 CHANGES/6923.bugfix create mode 120000 CHANGES/6923.doc diff --git a/CHANGES/6917.bugfix b/CHANGES/6917.bugfix new file mode 100644 index 00000000000..468e21a2b0f --- /dev/null +++ b/CHANGES/6917.bugfix @@ -0,0 +1,3 @@ +Dropped the :class:`object` type possibility from +the :py:attr:`aiohttp.ClientSession.timeout` +property return type declaration. diff --git a/CHANGES/6917.doc b/CHANGES/6917.doc new file mode 120000 index 00000000000..b8eddb8d6dc --- /dev/null +++ b/CHANGES/6917.doc @@ -0,0 +1 @@ +6917.bugfix \ No newline at end of file diff --git a/CHANGES/6923.bugfix b/CHANGES/6923.bugfix new file mode 120000 index 00000000000..b8eddb8d6dc --- /dev/null +++ b/CHANGES/6923.bugfix @@ -0,0 +1 @@ +6917.bugfix \ No newline at end of file diff --git a/CHANGES/6923.doc b/CHANGES/6923.doc new file mode 120000 index 00000000000..c05397962f9 --- /dev/null +++ b/CHANGES/6923.doc @@ -0,0 +1 @@ +6917.doc \ No newline at end of file diff --git a/aiohttp/client.py b/aiohttp/client.py index 3746d6d81e4..c555a64808b 100644 --- a/aiohttp/client.py +++ b/aiohttp/client.py @@ -1044,7 +1044,7 @@ def loop(self) -> asyncio.AbstractEventLoop: return self._loop @property - def timeout(self) -> Union[object, ClientTimeout]: + def timeout(self) -> ClientTimeout: """Timeout for the session.""" return self._timeout