4141 type SupportArg = Callable [[Parametrization ], Support | None ] | None
4242 type SupportResolver = Callable [[Parametrization ], Support | None ]
4343 type CharacteristicProvider = (
44- Mapping [ParametrizationName , CharacteristicFunction ] | CharacteristicFunction
44+ Mapping [ParametrizationName , CharacteristicFunction [Any , Any ]]
45+ | CharacteristicFunction [Any , Any ]
4546 )
4647 type CharacteristicsMap = Mapping [GenericCharacteristicName , CharacteristicProvider ]
48+ type NonParametrizedCharacteristic [In , Out ] = Callable [[], Out ]
49+ type CharacteristicFunction [In , Out ] = (
50+ NonParametrizedCharacteristic [In , Out ] | ParametrizedCharacteristic [In , Out ]
51+ )
52+
4753
48- type NonParametrizedCharacteristic = Callable [[], Any ]
49- type ParametrizedCharacteristic = (
50- Callable [[Parametrization , Any ], Any ] | Callable [[Parametrization ], Any ]
54+ type ParametrizedCharacteristic [In , Out ] = (
55+ Callable [[Parametrization , In ], Out ] | Callable [[Parametrization ], Out ]
5156)
52- type CharacteristicFunction = NonParametrizedCharacteristic | ParametrizedCharacteristic
5357
5458
5559class ParametricFamily :
@@ -94,7 +98,7 @@ def __init__(
9498 distr_parametrizations : list [ParametrizationName ],
9599 distr_characteristics : CharacteristicsMap ,
96100 sampling_strategy : SamplingStrategy | None = None ,
97- computation_strategy : ComputationStrategy [ Any , Any ] | None = None ,
101+ computation_strategy : ComputationStrategy | None = None ,
98102 support_by_parametrization : SupportArg = None ,
99103 ):
100104 self ._name = name
@@ -124,16 +128,17 @@ def __init__(
124128 )
125129
126130 def _process_char_val (
127- value : Mapping [ParametrizationName , CharacteristicFunction ] | CharacteristicFunction ,
128- ) -> dict [ParametrizationName , CharacteristicFunction ]:
131+ value : Mapping [ParametrizationName , CharacteristicFunction [Any , Any ]]
132+ | CharacteristicFunction [Any , Any ],
133+ ) -> dict [ParametrizationName , CharacteristicFunction [Any , Any ]]:
129134 return (
130135 dict (value )
131136 if isinstance (value , Mapping )
132137 else {self .base_parametrization_name : value }
133138 )
134139
135140 self .distr_characteristics : dict [
136- GenericCharacteristicName , dict [ParametrizationName , CharacteristicFunction ]
141+ GenericCharacteristicName , dict [ParametrizationName , CharacteristicFunction [ Any , Any ] ]
137142 ] = {key : _process_char_val (val ) for key , val in distr_characteristics .items ()}
138143
139144 # Precompute analytical plan
@@ -236,9 +241,9 @@ def to_base(self, parameters: Parametrization) -> Parametrization:
236241 return parameters .transform_to_base_parametrization ()
237242
238243 @staticmethod
239- def _bind_parametrization (
240- func : CharacteristicFunction , params_obj : Parametrization
241- ) -> ComputationFunc [Any , Any ]:
244+ def _bind_parametrization [ In , Out ] (
245+ func : CharacteristicFunction [ In , Out ] , params_obj : Parametrization
246+ ) -> ComputationFunc [In , Out ]:
242247 """Bind ``params_obj`` to ``func`` only when ``func`` can accept positional arguments.
243248
244249 This allows parametrization-independent analytical providers to be written without
@@ -258,8 +263,8 @@ def _bind_parametrization(
258263 )
259264
260265 return cast (
261- ComputationFunc [Any , Any ],
262- partial (cast (ParametrizedCharacteristic , func ), params_obj )
266+ ComputationFunc [In , Out ],
267+ partial (cast (ParametrizedCharacteristic [ In , Out ] , func ), params_obj )
263268 if accepts_first_positional
264269 else func ,
265270 )
0 commit comments