Skip to content

Commit 5080244

Browse files
authored
Merge pull request #460 from rstudio/wrap-async-args
2 parents 64b6726 + 33c1ecf commit 5080244

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

shiny/_utils.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import tempfile
1515
from typing import Any, Awaitable, Callable, Optional, TypeVar, cast
1616

17-
from ._typing_extensions import TypeGuard
17+
from ._typing_extensions import ParamSpec, TypeGuard
1818

1919
if sys.version_info >= (3, 8):
2020
CancelledError = asyncio.CancelledError
@@ -150,11 +150,12 @@ def private_seed():
150150
# ==============================================================================
151151

152152
T = TypeVar("T")
153+
P = ParamSpec("P")
153154

154155

155156
def 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

175176
def 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

Comments
 (0)