Skip to content
Snippets Groups Projects
Unverified Commit 56271827 authored by Sean Quah's avatar Sean Quah Committed by GitHub
Browse files

Use `ParamSpec` in type hints for `synapse.logging.context` (#12150)



Signed-off-by: default avatarSean Quah <seanq@element.io>
parent 0dc9c565
No related branches found
No related tags found
No related merge requests found
Use `ParamSpec` in type hints for `synapse.logging.context`.
...@@ -153,8 +153,9 @@ class InitialSyncHandler: ...@@ -153,8 +153,9 @@ class InitialSyncHandler:
public_room_ids = await self.store.get_public_room_ids() public_room_ids = await self.store.get_public_room_ids()
limit = pagin_config.limit if pagin_config.limit is not None:
if limit is None: limit = pagin_config.limit
else:
limit = 10 limit = 10
serializer_options = SerializeEventConfig(as_client_event=as_client_event) serializer_options = SerializeEventConfig(as_client_event=as_client_event)
......
...@@ -29,7 +29,6 @@ import warnings ...@@ -29,7 +29,6 @@ import warnings
from types import TracebackType from types import TracebackType
from typing import ( from typing import (
TYPE_CHECKING, TYPE_CHECKING,
Any,
Awaitable, Awaitable,
Callable, Callable,
Optional, Optional,
...@@ -41,7 +40,7 @@ from typing import ( ...@@ -41,7 +40,7 @@ from typing import (
) )
import attr import attr
from typing_extensions import Literal from typing_extensions import Literal, ParamSpec
from twisted.internet import defer, threads from twisted.internet import defer, threads
from twisted.python.threadpool import ThreadPool from twisted.python.threadpool import ThreadPool
...@@ -719,32 +718,33 @@ def nested_logging_context(suffix: str) -> LoggingContext: ...@@ -719,32 +718,33 @@ def nested_logging_context(suffix: str) -> LoggingContext:
) )
P = ParamSpec("P")
R = TypeVar("R") R = TypeVar("R")
@overload @overload
def preserve_fn( # type: ignore[misc] def preserve_fn( # type: ignore[misc]
f: Callable[..., Awaitable[R]], f: Callable[P, Awaitable[R]],
) -> Callable[..., "defer.Deferred[R]"]: ) -> Callable[P, "defer.Deferred[R]"]:
# The `type: ignore[misc]` above suppresses # The `type: ignore[misc]` above suppresses
# "Overloaded function signatures 1 and 2 overlap with incompatible return types" # "Overloaded function signatures 1 and 2 overlap with incompatible return types"
... ...
@overload @overload
def preserve_fn(f: Callable[..., R]) -> Callable[..., "defer.Deferred[R]"]: def preserve_fn(f: Callable[P, R]) -> Callable[P, "defer.Deferred[R]"]:
... ...
def preserve_fn( def preserve_fn(
f: Union[ f: Union[
Callable[..., R], Callable[P, R],
Callable[..., Awaitable[R]], Callable[P, Awaitable[R]],
] ]
) -> Callable[..., "defer.Deferred[R]"]: ) -> Callable[P, "defer.Deferred[R]"]:
"""Function decorator which wraps the function with run_in_background""" """Function decorator which wraps the function with run_in_background"""
def g(*args: Any, **kwargs: Any) -> "defer.Deferred[R]": def g(*args: P.args, **kwargs: P.kwargs) -> "defer.Deferred[R]":
return run_in_background(f, *args, **kwargs) return run_in_background(f, *args, **kwargs)
return g return g
...@@ -752,7 +752,7 @@ def preserve_fn( ...@@ -752,7 +752,7 @@ def preserve_fn(
@overload @overload
def run_in_background( # type: ignore[misc] def run_in_background( # type: ignore[misc]
f: Callable[..., Awaitable[R]], *args: Any, **kwargs: Any f: Callable[P, Awaitable[R]], *args: P.args, **kwargs: P.kwargs
) -> "defer.Deferred[R]": ) -> "defer.Deferred[R]":
# The `type: ignore[misc]` above suppresses # The `type: ignore[misc]` above suppresses
# "Overloaded function signatures 1 and 2 overlap with incompatible return types" # "Overloaded function signatures 1 and 2 overlap with incompatible return types"
...@@ -761,18 +761,22 @@ def run_in_background( # type: ignore[misc] ...@@ -761,18 +761,22 @@ def run_in_background( # type: ignore[misc]
@overload @overload
def run_in_background( def run_in_background(
f: Callable[..., R], *args: Any, **kwargs: Any f: Callable[P, R], *args: P.args, **kwargs: P.kwargs
) -> "defer.Deferred[R]": ) -> "defer.Deferred[R]":
... ...
def run_in_background( def run_in_background( # type: ignore[misc]
# The `type: ignore[misc]` above suppresses
# "Overloaded function implementation does not accept all possible arguments of signature 1"
# "Overloaded function implementation does not accept all possible arguments of signature 2"
# which seems like a bug in mypy.
f: Union[ f: Union[
Callable[..., R], Callable[P, R],
Callable[..., Awaitable[R]], Callable[P, Awaitable[R]],
], ],
*args: Any, *args: P.args,
**kwargs: Any, **kwargs: P.kwargs,
) -> "defer.Deferred[R]": ) -> "defer.Deferred[R]":
"""Calls a function, ensuring that the current context is restored after """Calls a function, ensuring that the current context is restored after
return from the function, and that the sentinel context is set once the return from the function, and that the sentinel context is set once the
...@@ -872,7 +876,7 @@ def _set_context_cb(result: ResultT, context: LoggingContext) -> ResultT: ...@@ -872,7 +876,7 @@ def _set_context_cb(result: ResultT, context: LoggingContext) -> ResultT:
def defer_to_thread( def defer_to_thread(
reactor: "ISynapseReactor", f: Callable[..., R], *args: Any, **kwargs: Any reactor: "ISynapseReactor", f: Callable[P, R], *args: P.args, **kwargs: P.kwargs
) -> "defer.Deferred[R]": ) -> "defer.Deferred[R]":
""" """
Calls the function `f` using a thread from the reactor's default threadpool and Calls the function `f` using a thread from the reactor's default threadpool and
...@@ -908,9 +912,9 @@ def defer_to_thread( ...@@ -908,9 +912,9 @@ def defer_to_thread(
def defer_to_threadpool( def defer_to_threadpool(
reactor: "ISynapseReactor", reactor: "ISynapseReactor",
threadpool: ThreadPool, threadpool: ThreadPool,
f: Callable[..., R], f: Callable[P, R],
*args: Any, *args: P.args,
**kwargs: Any, **kwargs: P.kwargs,
) -> "defer.Deferred[R]": ) -> "defer.Deferred[R]":
""" """
A wrapper for twisted.internet.threads.deferToThreadpool, which handles A wrapper for twisted.internet.threads.deferToThreadpool, which handles
......
...@@ -76,7 +76,8 @@ REQUIREMENTS = [ ...@@ -76,7 +76,8 @@ REQUIREMENTS = [
"netaddr>=0.7.18", "netaddr>=0.7.18",
"Jinja2>=2.9", "Jinja2>=2.9",
"bleach>=1.4.3", "bleach>=1.4.3",
"typing-extensions>=3.7.4", # We use `ParamSpec`, which was added in `typing-extensions` 3.10.0.0.
"typing-extensions>=3.10.0",
# We enforce that we have a `cryptography` version that bundles an `openssl` # We enforce that we have a `cryptography` version that bundles an `openssl`
# with the latest security patches. # with the latest security patches.
"cryptography>=3.4.7", "cryptography>=3.4.7",
......
...@@ -16,7 +16,7 @@ import abc ...@@ -16,7 +16,7 @@ import abc
import logging import logging
import os import os
import shutil import shutil
from typing import TYPE_CHECKING, Optional from typing import TYPE_CHECKING, Callable, Optional
from synapse.config._base import Config from synapse.config._base import Config
from synapse.logging.context import defer_to_thread, run_in_background from synapse.logging.context import defer_to_thread, run_in_background
...@@ -150,8 +150,13 @@ class FileStorageProviderBackend(StorageProvider): ...@@ -150,8 +150,13 @@ class FileStorageProviderBackend(StorageProvider):
dirname = os.path.dirname(backup_fname) dirname = os.path.dirname(backup_fname)
os.makedirs(dirname, exist_ok=True) os.makedirs(dirname, exist_ok=True)
# mypy needs help inferring the type of the second parameter, which is generic
shutil_copyfile: Callable[[str, str], str] = shutil.copyfile
await defer_to_thread( await defer_to_thread(
self.hs.get_reactor(), shutil.copyfile, primary_fname, backup_fname self.hs.get_reactor(),
shutil_copyfile,
primary_fname,
backup_fname,
) )
async def fetch(self, path: str, file_info: FileInfo) -> Optional[Responder]: async def fetch(self, path: str, file_info: FileInfo) -> Optional[Responder]:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment