1414import tempfile
1515from typing import Any , Awaitable , Callable , Optional , TypeVar , cast
1616
17- from ._typing_extensions import TypeGuard
17+ from ._typing_extensions import ParamSpec , TypeGuard
1818
1919if sys .version_info >= (3 , 8 ):
2020 CancelledError = asyncio .CancelledError
@@ -150,11 +150,12 @@ def private_seed():
150150# ==============================================================================
151151
152152T = TypeVar ("T" )
153+ P = ParamSpec ("P" )
153154
154155
155156def wrap_async (
156- fn : Callable [[], Awaitable [ T ]] | Callable [[], T ]
157- ) -> Callable [[] , Awaitable [T ]]:
157+ fn : Callable [P , T ] | Callable [P , Awaitable [ T ] ]
158+ ) -> Callable [P , Awaitable [T ]]:
158159 """
159160 Given a synchronous function that returns T, return an async function that wraps the
160161 original function. If the input function is already async, then return it unchanged.
@@ -163,18 +164,18 @@ def wrap_async(
163164 if is_async_callable (fn ):
164165 return fn
165166
166- fn = cast (Callable [[] , T ], fn )
167+ fn = cast (Callable [P , T ], fn )
167168
168169 @functools .wraps (fn )
169- async def fn_async () -> T :
170- return fn ()
170+ async def fn_async (* args : P . args , ** kwargs : P . kwargs ) -> T :
171+ return fn (* args , ** kwargs )
171172
172173 return fn_async
173174
174175
175176def is_async_callable (
176- obj : Callable [... , T ] | Callable [... , Awaitable [T ]]
177- ) -> TypeGuard [Callable [... , Awaitable [T ]]]:
177+ obj : Callable [P , T ] | Callable [P , Awaitable [T ]]
178+ ) -> TypeGuard [Callable [P , Awaitable [T ]]]:
178179 """
179180 Returns True if `obj` is an `async def` function, or if it's an object with a
180181 `__call__` method which is an `async def` function. This function should generally
0 commit comments