11from __future__ import annotations
22
3- from functools import cache , cached_property , lru_cache , wraps
3+ from functools import cache , cached_property , lru_cache , update_wrapper , wraps
44from typing import Callable , ParamSpec , TypeVar
55from typing_extensions import assert_type
66
@@ -33,9 +33,26 @@ def wrapped(x: int) -> None: ...
3333 def identical_wrapper (x : int ) -> None : ...
3434 @wraps (wrapped )
3535 def other_signature_wrapper (x : str , y : float ) -> None : ...
36+ @wraps (wrapped )
37+ def no_args_wrapper () -> None : ...
38+ @wraps (wrapped )
39+ def keyword_only_wrapper (* , x : int ) -> None : ...
3640
3741 identical_wrapper (3 )
42+ identical_wrapper (x = 3 )
3843 other_signature_wrapper ("parrot" , 42.0 )
44+ no_args_wrapper ()
45+ keyword_only_wrapper (x = 3 )
46+
47+
48+ def check_update_wrapper () -> None :
49+ def wrapped (x : int ) -> None : ...
50+ def wrapper (* , text : str ) -> int :
51+ return len (text )
52+
53+ updated = update_wrapper (wrapper , wrapped )
54+ assert_type (updated (text = "parrot" ), int )
55+ assert_type (updated .__wrapped__ (3 ), None )
3956
4057
4158def check_wraps_method () -> None :
@@ -44,18 +61,19 @@ def wrapped(self, x: int) -> None: ...
4461 @wraps (wrapped )
4562 def wrapper (self , x : int ) -> None : ...
4663
47- class Wrapper : # pyright: ignore[reportUnusedClass]
64+ class Wrapper :
4865 @wraps (Wrapped .wrapped )
4966 def method (self , x : int ) -> None : ...
5067
5168 @wraps (Wrapped .wrapped )
5269 def func_wrapper (x : int ) -> None : ...
5370
54- # TODO: The following should work, but currently don't.
55- # https://github.com/python/typeshed/issues/10653
56- # Wrapped().wrapper(3 )
57- # Wrapper().method(3)
71+ assert_type ( Wrapped . wrapper ( Wrapped (), x = 3 ), None )
72+ assert_type ( Wrapped (). wrapper ( 3 ), None )
73+ assert_type ( Wrapped ().wrapper (x = 3 ), None )
74+ assert_type ( Wrapper ().method (3 ), None )
5875 func_wrapper (3 )
76+ func_wrapper (x = 3 )
5977
6078
6179#
0 commit comments