44
44
NoReturn ,
45
45
Protocol ,
46
46
TypeGuard ,
47
+ TypeVar ,
47
48
overload ,
48
49
)
49
50
@@ -2647,10 +2648,12 @@ def __getattribute__(self, name: str) -> Any:
2647
2648
fail ("Stepped on a land mine, trying to access attribute " + repr (name ) + ":\n " + self .__message__ )
2648
2649
2649
2650
2651
+ CConverterClassT = TypeVar ("CConverterClassT" , bound = type ["CConverter" ])
2652
+
2650
2653
def add_c_converter (
2651
- f : type [ CConverter ] ,
2654
+ f : CConverterClassT ,
2652
2655
name : str | None = None
2653
- ) -> type [ CConverter ] :
2656
+ ) -> CConverterClassT :
2654
2657
if not name :
2655
2658
name = f .__name__
2656
2659
if not name .endswith ('_converter' ):
@@ -2659,7 +2662,7 @@ def add_c_converter(
2659
2662
converters [name ] = f
2660
2663
return f
2661
2664
2662
- def add_default_legacy_c_converter (cls ) :
2665
+ def add_default_legacy_c_converter (cls : CConverterClassT ) -> CConverterClassT :
2663
2666
# automatically add converter for default format unit
2664
2667
# (but without stomping on the existing one if it's already
2665
2668
# set, in case you subclass)
@@ -2670,16 +2673,19 @@ def add_default_legacy_c_converter(cls):
2670
2673
2671
2674
def add_legacy_c_converter (
2672
2675
format_unit : str ,
2673
- ** kwargs
2674
- ) -> Callable [[ConverterType ], ConverterType ]:
2676
+ ** kwargs : Any
2677
+ ) -> Callable [[CConverterClassT ], CConverterClassT ]:
2675
2678
"""
2676
2679
Adds a legacy converter.
2677
2680
"""
2678
- def closure (f ):
2681
+ def closure (f : CConverterClassT ) -> CConverterClassT :
2682
+ added_f : Callable [..., CConverter ]
2679
2683
if not kwargs :
2680
2684
added_f = f
2681
2685
else :
2682
- added_f = functools .partial (f , ** kwargs )
2686
+ # mypy's special-casing for functools.partial
2687
+ # can't quite grapple with this code here
2688
+ added_f = functools .partial (f , ** kwargs ) # type: ignore[arg-type]
2683
2689
if format_unit :
2684
2690
legacy_converters [format_unit ] = added_f
2685
2691
return f
0 commit comments