Skip to content

Commit 6ddb6f1

Browse files
cdce8pseifertm
authored andcommitted
Simplify and improve typing even further
1 parent b9c65d2 commit 6ddb6f1

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ dynamic = [
3838

3939
dependencies = [
4040
"pytest>=8.2,<9",
41+
"typing-extensions>=4.12; python_version<'3.10'",
4142
]
4243
optional-dependencies.docs = [
4344
"sphinx>=5.3",

pytest_asyncio/plugin.py

+19-19
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import functools
1010
import inspect
1111
import socket
12+
import sys
1213
import warnings
1314
from asyncio import AbstractEventLoop, AbstractEventLoopPolicy
1415
from collections.abc import (
@@ -53,21 +54,17 @@
5354
StashKey,
5455
)
5556

57+
if sys.version_info >= (3, 10):
58+
from typing import ParamSpec
59+
else:
60+
from typing_extensions import ParamSpec
61+
62+
5663
_ScopeName = Literal["session", "package", "module", "class", "function"]
5764
_T = TypeVar("_T")
58-
59-
FixtureFunctionT = TypeVar(
60-
"FixtureFunctionT",
61-
bound=Union[Callable[..., Awaitable[Any]], Callable[..., AsyncIterator[Any]]],
62-
)
63-
FixtureFunctionU = TypeVar(
64-
"FixtureFunctionU",
65-
bound=Union[Callable[..., Awaitable[Any]], Callable[..., AsyncIterator[Any]]],
66-
)
67-
FixtureFunctionType = Union[
68-
Callable[..., Awaitable[Any]], Callable[..., AsyncIterator[Any]]
69-
]
70-
FixtureFunctionMarker = Callable[[FixtureFunctionT], FixtureFunctionT]
65+
_R = TypeVar("_R", bound=Union[Awaitable[Any], AsyncIterator[Any]])
66+
_P = ParamSpec("_P")
67+
FixtureFunction = Callable[_P, _R]
7168

7269

7370
class PytestAsyncioError(Exception):
@@ -121,7 +118,7 @@ def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager) -> None
121118

122119
@overload
123120
def fixture(
124-
fixture_function: FixtureFunctionT,
121+
fixture_function: FixtureFunction[_P, _R],
125122
*,
126123
scope: _ScopeName | Callable[[str, Config], _ScopeName] = ...,
127124
loop_scope: _ScopeName | None = ...,
@@ -133,7 +130,7 @@ def fixture(
133130
| None
134131
) = ...,
135132
name: str | None = ...,
136-
) -> FixtureFunctionT: ...
133+
) -> FixtureFunction[_P, _R]: ...
137134

138135

139136
@overload
@@ -150,22 +147,25 @@ def fixture(
150147
| None
151148
) = ...,
152149
name: str | None = None,
153-
) -> FixtureFunctionMarker[FixtureFunctionU]: ...
150+
) -> Callable[[FixtureFunction[_P, _R]], FixtureFunction[_P, _R]]: ...
154151

155152

156153
def fixture(
157-
fixture_function: FixtureFunctionT | None = None,
154+
fixture_function: FixtureFunction[_P, _R] | None = None,
158155
loop_scope: _ScopeName | None = None,
159156
**kwargs: Any,
160-
) -> FixtureFunctionT | FixtureFunctionMarker[FixtureFunctionU]:
157+
) -> (
158+
FixtureFunction[_P, _R]
159+
| Callable[[FixtureFunction[_P, _R]], FixtureFunction[_P, _R]]
160+
):
161161
if fixture_function is not None:
162162
_make_asyncio_fixture_function(fixture_function, loop_scope)
163163
return pytest.fixture(fixture_function, **kwargs)
164164

165165
else:
166166

167167
@functools.wraps(fixture)
168-
def inner(fixture_function: FixtureFunctionU) -> FixtureFunctionU:
168+
def inner(fixture_function: FixtureFunction[_P, _R]) -> FixtureFunction[_P, _R]:
169169
return fixture(fixture_function, loop_scope=loop_scope, **kwargs)
170170

171171
return inner

0 commit comments

Comments
 (0)