@@ -182,7 +182,7 @@ def __init__(
182
182
"""Initialize the parameter.
183
183
184
184
Parameters:
185
- name: The parameter name.
185
+ name: The parameter name, without leading stars (`*` or `**`) .
186
186
annotation: The parameter annotation, if any.
187
187
kind: The parameter kind.
188
188
default: The parameter default, if any.
@@ -266,31 +266,61 @@ def __init__(self, *parameters: Parameter) -> None:
266
266
Parameters:
267
267
*parameters: The initial parameters to add to the container.
268
268
"""
269
- self ._parameters_list : list [Parameter ] = []
270
- self ._parameters_dict : dict [str , Parameter ] = {}
271
- for parameter in parameters :
272
- self .add (parameter )
269
+ self ._params : list [Parameter ] = list (parameters )
273
270
274
271
def __repr__ (self ) -> str :
275
- return f"Parameters({ ', ' .join (repr (param ) for param in self ._parameters_list )} )"
272
+ return f"Parameters({ ', ' .join (repr (param ) for param in self ._params )} )"
276
273
277
274
def __getitem__ (self , name_or_index : int | str ) -> Parameter :
278
275
"""Get a parameter by index or name."""
279
276
if isinstance (name_or_index , int ):
280
- return self ._parameters_list [name_or_index ]
281
- return self ._parameters_dict [name_or_index .lstrip ("*" )]
277
+ return self ._params [name_or_index ]
278
+ name = name_or_index .lstrip ("*" )
279
+ try :
280
+ return next (param for param in self ._params if param .name == name )
281
+ except StopIteration as error :
282
+ raise KeyError (f"parameter { name_or_index } not found" ) from error
283
+
284
+ def __setitem__ (self , name_or_index : int | str , parameter : Parameter ) -> None :
285
+ """Set a parameter by index or name."""
286
+ if isinstance (name_or_index , int ):
287
+ self ._params [name_or_index ] = parameter
288
+ else :
289
+ name = name_or_index .lstrip ("*" )
290
+ try :
291
+ index = next (idx for idx , param in enumerate (self ._params ) if param .name == name )
292
+ except StopIteration :
293
+ self ._params .append (parameter )
294
+ else :
295
+ self ._params [index ] = parameter
296
+
297
+ def __delitem__ (self , name_or_index : int | str ) -> None :
298
+ """Delete a parameter by index or name."""
299
+ if isinstance (name_or_index , int ):
300
+ del self ._params [name_or_index ]
301
+ else :
302
+ name = name_or_index .lstrip ("*" )
303
+ try :
304
+ index = next (idx for idx , param in enumerate (self ._params ) if param .name == name )
305
+ except StopIteration as error :
306
+ raise KeyError (f"parameter { name_or_index } not found" ) from error
307
+ del self ._params [index ]
282
308
283
309
def __len__ (self ):
284
310
"""The number of parameters."""
285
- return len (self ._parameters_list )
311
+ return len (self ._params )
286
312
287
313
def __iter__ (self ):
288
314
"""Iterate over the parameters, in order."""
289
- return iter (self ._parameters_list )
315
+ return iter (self ._params )
290
316
291
317
def __contains__ (self , param_name : str ):
292
318
"""Whether a parameter with the given name is present."""
293
- return param_name .lstrip ("*" ) in self ._parameters_dict
319
+ try :
320
+ next (param for param in self ._params if param .name == param_name .lstrip ("*" ))
321
+ except StopIteration :
322
+ return False
323
+ return True
294
324
295
325
def add (self , parameter : Parameter ) -> None :
296
326
"""Add a parameter to the container.
@@ -301,11 +331,9 @@ def add(self, parameter: Parameter) -> None:
301
331
Raises:
302
332
ValueError: When a parameter with the same name is already present.
303
333
"""
304
- if parameter .name not in self ._parameters_dict :
305
- self ._parameters_dict [parameter .name ] = parameter
306
- self ._parameters_list .append (parameter )
307
- else :
334
+ if parameter .name in self :
308
335
raise ValueError (f"parameter { parameter .name } already present" )
336
+ self ._params .append (parameter )
309
337
310
338
311
339
class Object (ObjectAliasMixin ):
0 commit comments