4444NoReturn ,
4545Protocol ,
4646TypeGuard ,
47+ TypeVar ,
4748overload ,
4849)
4950
@@ -2647,10 +2648,12 @@ def __getattribute__(self, name: str) -> Any:
26472648fail ("Stepped on a land mine, trying to access attribute " + repr (name )+ ":\n " + self .__message__ )
26482649
26492650
2651+ CConverterClassT = TypeVar ("CConverterClassT" ,bound = type ["CConverter" ])
2652+
26502653def add_c_converter (
2651- f :type [ CConverter ] ,
2654+ f :CConverterClassT ,
26522655name :str | None = None
2653- )-> type [ CConverter ] :
2656+ )-> CConverterClassT :
26542657if not name :
26552658name = f .__name__
26562659if not name .endswith ('_converter' ):
@@ -2659,7 +2662,7 @@ def add_c_converter(
26592662converters [name ]= f
26602663return f
26612664
2662- def add_default_legacy_c_converter (cls ) :
2665+ def add_default_legacy_c_converter (cls : CConverterClassT ) -> CConverterClassT :
26632666# automatically add converter for default format unit
26642667# (but without stomping on the existing one if it's already
26652668# set, in case you subclass)
@@ -2670,16 +2673,19 @@ def add_default_legacy_c_converter(cls):
26702673
26712674def add_legacy_c_converter (
26722675format_unit :str ,
2673- ** kwargs
2674- )-> Callable [[ConverterType ],ConverterType ]:
2676+ ** kwargs : Any
2677+ )-> Callable [[CConverterClassT ],CConverterClassT ]:
26752678"""
26762679 Adds a legacy converter.
26772680 """
2678- def closure (f ):
2681+ def closure (f :CConverterClassT )-> CConverterClassT :
2682+ added_f :Callable [...,CConverter ]
26792683if not kwargs :
26802684added_f = f
26812685else :
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]
26832689if format_unit :
26842690legacy_converters [format_unit ]= added_f
26852691return f