import inspect
+import sys
from contextlib import AsyncExitStack, contextmanager
from copy import copy, deepcopy
from dataclasses import dataclass
from starlette.websockets import WebSocket
from typing_extensions import Annotated, get_args, get_origin
+if sys.version_info >= (3, 13): # pragma: no cover
+ from inspect import iscoroutinefunction
+else: # pragma: no cover
+ from asyncio import iscoroutinefunction
+
multipart_not_installed_error = (
'Form data requires "python-multipart" to be installed. \n'
'You can install "python-multipart" with: \n\n'
def is_coroutine_callable(call: Callable[..., Any]) -> bool:
if inspect.isroutine(call):
- return inspect.iscoroutinefunction(call)
+ return iscoroutinefunction(call)
if inspect.isclass(call):
return False
dunder_call = getattr(call, "__call__", None) # noqa: B004
- return inspect.iscoroutinefunction(dunder_call)
+ return iscoroutinefunction(dunder_call)
def is_async_gen_callable(call: Callable[..., Any]) -> bool:
-import asyncio
import dataclasses
import email.message
import inspect
import json
+import sys
from contextlib import AsyncExitStack, asynccontextmanager
from enum import Enum, IntEnum
from typing import (
from starlette.websockets import WebSocket
from typing_extensions import Annotated, Doc, deprecated
+if sys.version_info >= (3, 13): # pragma: no cover
+ from inspect import iscoroutinefunction
+else: # pragma: no cover
+ from asyncio import iscoroutinefunction
+
def _prepare_response_content(
res: Any,
embed_body_fields: bool = False,
) -> Callable[[Request], Coroutine[Any, Any, Response]]:
assert dependant.call is not None, "dependant.call must be a function"
- is_coroutine = asyncio.iscoroutinefunction(dependant.call)
+ is_coroutine = iscoroutinefunction(dependant.call)
is_body_form = body_field and isinstance(body_field.field_info, params.Form)
if isinstance(response_class, DefaultPlaceholder):
actual_response_class: Type[Response] = response_class.value