Merge pull request #118 from naoki-jarvisml/var_keyword

Support functions with VAR_KEYWORD parameter
This commit is contained in:
long2ice
2023-02-15 10:30:12 +08:00
committed by GitHub
3 changed files with 21 additions and 1 deletions

View File

@@ -42,6 +42,13 @@ async def get_date():
async def get_datetime(request: Request, response: Response): async def get_datetime(request: Request, response: Response):
return {"now": pendulum.now()} return {"now": pendulum.now()}
@cache(namespace="test")
async def func_kwargs(*unused_args, **kwargs):
return kwargs
@app.get("/kwargs")
async def get_kwargs(name: str):
return await func_kwargs(name, name=name)
@app.get("/sync-me") @app.get("/sync-me")
@cache(namespace="test") @cache(namespace="test")

View File

@@ -48,7 +48,13 @@ def cache(
(param for param in signature.parameters.values() if param.annotation is Response), (param for param in signature.parameters.values() if param.annotation is Response),
None, None,
) )
parameters = [*signature.parameters.values()] parameters = []
extra_params = []
for p in signature.parameters.values():
if p.kind <= inspect.Parameter.KEYWORD_ONLY:
parameters.append(p)
else:
extra_params.append(p)
if not request_param: if not request_param:
parameters.append( parameters.append(
inspect.Parameter( inspect.Parameter(
@@ -65,6 +71,7 @@ def cache(
kind=inspect.Parameter.KEYWORD_ONLY, kind=inspect.Parameter.KEYWORD_ONLY,
), ),
) )
parameters.extend(extra_params)
if parameters: if parameters:
signature = signature.replace(parameters=parameters) signature = signature.replace(parameters=parameters)
func.__signature__ = signature func.__signature__ = signature

View File

@@ -67,3 +67,9 @@ def test_cache_response_obj() -> None:
assert get_cache_response.json() == {"a": 1} assert get_cache_response.json() == {"a": 1}
assert get_cache_response.headers.get("cache-control") assert get_cache_response.headers.get("cache-control")
assert get_cache_response.headers.get("etag") assert get_cache_response.headers.get("etag")
def test_kwargs() -> None:
with TestClient(app) as client:
name = "Jon"
response = client.get("/kwargs", params = {"name": name})
assert response.json() == {"name": name}