Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

✨ Allow using dependables withfunctools.partial()#9753

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
Show file tree
Hide file tree
Changes fromall commits
Commits
Show all changes
20 commits
Select commitHold shift + click to select a range
d689b00
Rename tests/test_dependency_class.py -> tests/test_dependency_types.py
lieryanJan 22, 2024
57e1718
Add test for sync/async function/gen dependencies
lieryanJan 22, 2024
f16dd38
Add support for functools.partial()-wrapped dependables
lieryanJan 22, 2024
3ba104e
🎨 [pre-commit.ci] Auto format from pre-commit.com hooks
pre-commit-ci[bot]Jan 22, 2024
05ab699
Fix async_gen_dependency() should use yield; also fix type annotation
lieryanJan 22, 2024
b593e49
🎨 [pre-commit.ci] Auto format from pre-commit.com hooks
pre-commit-ci[bot]Jan 22, 2024
f20d338
Merge branch 'master' into lieryan-dependencies-with-functools-partial
YuriiMotovJun 24, 2025
a6e9c03
🎨 [pre-commit.ci] Auto format from pre-commit.com hooks
pre-commit-ci[bot]Jun 24, 2025
5407429
Merge remote-tracking branch 'upstream/master' into lieryan-dependenc…
YuriiMotovJul 6, 2025
9a434c4
Restore `test_dependency_class.py`
YuriiMotovJul 6, 2025
ce77af9
Clean up tests for partial dependencies and rename to `test_dependenc…
YuriiMotovJul 6, 2025
41d7016
🎨 [pre-commit.ci] Auto format from pre-commit.com hooks
pre-commit-ci[bot]Jul 6, 2025
53b67a2
Merge branch 'master' into lieryan-dependencies-with-functools-partial
YuriiMotovJul 10, 2025
0448ff1
Merge branch 'master' into lieryan-dependencies-with-functools-partial
YuriiMotovSep 20, 2025
d193739
Merge remote-tracking branch 'upstream/master' into lieryan-dependenc…
YuriiMotovNov 5, 2025
a5f1199
Remove unused import, make changes in `models.py`
YuriiMotovNov 5, 2025
c687deb
Merge branch 'master' into lieryan-dependencies-with-functools-partial
YuriiMotovDec 2, 2025
1202318
♻️ Move partial extraction logic to Dependant._unwrapped_call
tiangoloDec 2, 2025
d940395
♻️ Tweak tests to use Annotated for dependencies
tiangoloDec 2, 2025
128fdcc
Merge branch 'master' into lieryan-dependencies-with-functools-partial
tiangoloDec 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletionsfastapi/dependencies/models.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import inspect
import sys
from dataclasses import dataclass, field
from functools import cached_property
from functools import cached_property, partial
from typing import Any, Callable, List, Optional, Sequence, Union

from fastapi._compat import ModelField
Expand DownExpand Up@@ -79,7 +79,10 @@ def _uses_scopes(self) -> bool:
def _unwrapped_call(self) -> Any:
if self.call is None:
return self.call # pragma: no cover
return inspect.unwrap(self.call)
unwrapped = inspect.unwrap(self.call)
if isinstance(unwrapped, partial):
unwrapped = unwrapped.func
return unwrapped

@cached_property
def is_gen_callable(self) -> bool:
Expand Down
251 changes: 251 additions & 0 deletionstests/test_dependency_partial.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
from functools import partial
from typing import AsyncGenerator, Generator

import pytest
from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient
from typing_extensions import Annotated

app = FastAPI()


def function_dependency(value: str) -> str:
return value


async def async_function_dependency(value: str) -> str:
return value


def gen_dependency(value: str) -> Generator[str, None, None]:
yield value


async def async_gen_dependency(value: str) -> AsyncGenerator[str, None]:
yield value


class CallableDependency:
def __call__(self, value: str) -> str:
return value


class CallableGenDependency:
def __call__(self, value: str) -> Generator[str, None, None]:
yield value


class AsyncCallableDependency:
async def __call__(self, value: str) -> str:
return value


class AsyncCallableGenDependency:
async def __call__(self, value: str) -> AsyncGenerator[str, None]:
yield value


class MethodsDependency:
def synchronous(self, value: str) -> str:
return value

async def asynchronous(self, value: str) -> str:
return value

def synchronous_gen(self, value: str) -> Generator[str, None, None]:
yield value

async def asynchronous_gen(self, value: str) -> AsyncGenerator[str, None]:
yield value


callable_dependency = CallableDependency()
callable_gen_dependency = CallableGenDependency()
async_callable_dependency = AsyncCallableDependency()
async_callable_gen_dependency = AsyncCallableGenDependency()
methods_dependency = MethodsDependency()


@app.get("/partial-function-dependency")
async def get_partial_function_dependency(
value: Annotated[
str, Depends(partial(function_dependency, "partial-function-dependency"))
],
) -> str:
return value


@app.get("/partial-async-function-dependency")
async def get_partial_async_function_dependency(
value: Annotated[
str,
Depends(
partial(async_function_dependency, "partial-async-function-dependency")
),
],
) -> str:
return value


@app.get("/partial-gen-dependency")
async def get_partial_gen_dependency(
value: Annotated[str, Depends(partial(gen_dependency, "partial-gen-dependency"))],
) -> str:
return value


@app.get("/partial-async-gen-dependency")
async def get_partial_async_gen_dependency(
value: Annotated[
str, Depends(partial(async_gen_dependency, "partial-async-gen-dependency"))
],
) -> str:
return value


@app.get("/partial-callable-dependency")
async def get_partial_callable_dependency(
value: Annotated[
str, Depends(partial(callable_dependency, "partial-callable-dependency"))
],
) -> str:
return value


@app.get("/partial-callable-gen-dependency")
async def get_partial_callable_gen_dependency(
value: Annotated[
str,
Depends(partial(callable_gen_dependency, "partial-callable-gen-dependency")),
],
) -> str:
return value


@app.get("/partial-async-callable-dependency")
async def get_partial_async_callable_dependency(
value: Annotated[
str,
Depends(
partial(async_callable_dependency, "partial-async-callable-dependency")
),
],
) -> str:
return value


@app.get("/partial-async-callable-gen-dependency")
async def get_partial_async_callable_gen_dependency(
value: Annotated[
str,
Depends(
partial(
async_callable_gen_dependency, "partial-async-callable-gen-dependency"
)
),
],
) -> str:
return value


@app.get("/partial-synchronous-method-dependency")
async def get_partial_synchronous_method_dependency(
value: Annotated[
str,
Depends(
partial(
methods_dependency.synchronous, "partial-synchronous-method-dependency"
)
),
],
) -> str:
return value


@app.get("/partial-synchronous-method-gen-dependency")
async def get_partial_synchronous_method_gen_dependency(
value: Annotated[
str,
Depends(
partial(
methods_dependency.synchronous_gen,
"partial-synchronous-method-gen-dependency",
)
),
],
) -> str:
return value


@app.get("/partial-asynchronous-method-dependency")
async def get_partial_asynchronous_method_dependency(
value: Annotated[
str,
Depends(
partial(
methods_dependency.asynchronous,
"partial-asynchronous-method-dependency",
)
),
],
) -> str:
return value


@app.get("/partial-asynchronous-method-gen-dependency")
async def get_partial_asynchronous_method_gen_dependency(
value: Annotated[
str,
Depends(
partial(
methods_dependency.asynchronous_gen,
"partial-asynchronous-method-gen-dependency",
)
),
],
) -> str:
return value


client = TestClient(app)


@pytest.mark.parametrize(
"route,value",
[
("/partial-function-dependency", "partial-function-dependency"),
(
"/partial-async-function-dependency",
"partial-async-function-dependency",
),
("/partial-gen-dependency", "partial-gen-dependency"),
("/partial-async-gen-dependency", "partial-async-gen-dependency"),
("/partial-callable-dependency", "partial-callable-dependency"),
("/partial-callable-gen-dependency", "partial-callable-gen-dependency"),
("/partial-async-callable-dependency", "partial-async-callable-dependency"),
(
"/partial-async-callable-gen-dependency",
"partial-async-callable-gen-dependency",
),
(
"/partial-synchronous-method-dependency",
"partial-synchronous-method-dependency",
),
(
"/partial-synchronous-method-gen-dependency",
"partial-synchronous-method-gen-dependency",
),
(
"/partial-asynchronous-method-dependency",
"partial-asynchronous-method-dependency",
),
(
"/partial-asynchronous-method-gen-dependency",
"partial-asynchronous-method-gen-dependency",
),
],
)
def test_dependency_types_with_partial(route: str, value: str) -> None:
response = client.get(route)
assert response.status_code == 200, response.text
assert response.json() == value

[8]ページ先頭

©2009-2026 Movatter.jp