From a5fa30fc7e4664b40c675192ca8f65c06d1f4c4d Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Mon, 3 Oct 2022 15:03:10 -0700 Subject: [PATCH 1/3] Add a test case for covariant asyncio.Task As per #8781 --- test_cases/stdlib/asyncio/check_task.py | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test_cases/stdlib/asyncio/check_task.py diff --git a/test_cases/stdlib/asyncio/check_task.py b/test_cases/stdlib/asyncio/check_task.py new file mode 100644 index 000000000000..66fca489dfc6 --- /dev/null +++ b/test_cases/stdlib/asyncio/check_task.py @@ -0,0 +1,26 @@ +import asyncio + + +class Waiter: + def __init__(self) -> None: + self.tasks: list[asyncio.Task[object]] = [] + + def add(self, t: asyncio.Task[object]) -> None: + self.tasks.append(t) + + async def join(self) -> None: + await asyncio.wait(self.tasks) + + +async def foo() -> int: + ... + + +async def main() -> None: + # asyncio.Task is covariant in its type argument, which is unusual since its parent class + # asyncio.Future is invariant in its type argument. This is only sound because asyncio.Task + # is not actually Liskov substitutable for asyncio.Future: it does not implement set_result. + w = Waiter() + t: asyncio.Task[int] = asyncio.create_task(foo()) + w.add(t) + await w.join() From 9fc95c0991d5b6042b38d68a005d9bbc0e0e1e6a Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Mon, 3 Oct 2022 15:12:33 -0700 Subject: [PATCH 2/3] future annotations --- test_cases/stdlib/asyncio/check_task.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test_cases/stdlib/asyncio/check_task.py b/test_cases/stdlib/asyncio/check_task.py index 66fca489dfc6..27e05dec92ff 100644 --- a/test_cases/stdlib/asyncio/check_task.py +++ b/test_cases/stdlib/asyncio/check_task.py @@ -1,3 +1,4 @@ +from __future__ import annotations import asyncio From c7b2feb8ee7c943adaa33f0e1e49110ec7b536ed Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 22:14:11 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks --- test_cases/stdlib/asyncio/check_task.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test_cases/stdlib/asyncio/check_task.py b/test_cases/stdlib/asyncio/check_task.py index 27e05dec92ff..d674c44abb8b 100644 --- a/test_cases/stdlib/asyncio/check_task.py +++ b/test_cases/stdlib/asyncio/check_task.py @@ -1,4 +1,5 @@ from __future__ import annotations + import asyncio