99import functools
1010import inspect
1111import socket
12+ import sys
1213import warnings
1314from asyncio import AbstractEventLoop , AbstractEventLoopPolicy
1415from collections .abc import (
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
7370class PytestAsyncioError (Exception ):
@@ -121,7 +118,7 @@ def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager) -> None
121118
122119@overload
123120def 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
156153def 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