Add __name__ to _Wrapped in functools (#9835)

This commit is contained in:
Thomas M Kehrenberg
2023-03-03 16:02:51 +01:00
committed by GitHub
parent 45f0a5e7e4
commit d76259a062
2 changed files with 25 additions and 1 deletions

View File

@@ -72,6 +72,9 @@ WRAPPER_UPDATES: tuple[Literal["__dict__"]]
class _Wrapped(Generic[_PWrapped, _RWrapped, _PWrapper, _RWapper]):
__wrapped__: Callable[_PWrapped, _RWrapped]
def __call__(self, *args: _PWrapper.args, **kwargs: _PWrapper.kwargs) -> _RWapper: ...
# as with ``Callable``, we'll assume that these attributes exist
__name__: str
__qualname__: str
class _Wrapper(Generic[_PWrapped, _RWrapped]):
def __call__(self, f: Callable[_PWrapper, _RWapper]) -> _Wrapped[_PWrapped, _RWrapped, _PWrapper, _RWapper]: ...

View File

@@ -1,10 +1,31 @@
from __future__ import annotations
import sys
from functools import wraps
from typing import Callable, TypeVar
from typing_extensions import ParamSpec, assert_type
P = ParamSpec("P")
T_co = TypeVar("T_co", covariant=True)
def my_decorator(func: Callable[P, T_co]) -> Callable[P, T_co]:
@wraps(func)
def wrapper(*args: P.args, **kwargs: P.kwargs) -> T_co:
print(args)
return func(*args, **kwargs)
# verify that the wrapped function has all these attributes
wrapper.__annotations__ = func.__annotations__
wrapper.__doc__ = func.__doc__
wrapper.__module__ = func.__module__
wrapper.__name__ = func.__name__
wrapper.__qualname__ = func.__qualname__
return wrapper
if sys.version_info >= (3, 8):
from functools import cached_property
from typing_extensions import assert_type
class A:
def __init__(self, x: int):