@@ -307,7 +307,7 @@ def __repr__(self):
307307_deprecated_parameter = _deprecated_parameter_class ()
308308
309309
310- def _delete_parameter (since , name , func = None ):
310+ def _delete_parameter (since , name , func = None , ** kwargs ):
311311 """
312312 Decorator indicating that parameter *name* of *func* is being deprecated.
313313
@@ -320,6 +320,8 @@ def _delete_parameter(since, name, func=None):
320320 such after the deprecation period has passed and the deprecated parameter
321321 is removed.
322322
323+ Additional keyword arguments are passed to `.warn_deprecated`.
324+
323325 Examples
324326 --------
325327 ::
@@ -329,29 +331,45 @@ def func(used_arg, other_arg, unused, more_args): ...
329331 """
330332
331333 if func is None :
332- return functools .partial (_delete_parameter , since , name )
334+ return functools .partial (_delete_parameter , since , name , ** kwargs )
333335
334336 signature = inspect .signature (func )
335337 assert name in signature .parameters , (
336338 f"Matplotlib internal error: { name !r} must be a parameter for "
337339 f"{ func .__name__ } ()" )
338- func .__signature__ = signature .replace (parameters = [
339- param .replace (default = _deprecated_parameter ) if param .name == name
340- else param
341- for param in signature .parameters .values ()])
340+ kind = signature .parameters [name ].kind
341+ is_varargs = kind is inspect .Parameter .VAR_POSITIONAL
342+ is_varkwargs = kind is inspect .Parameter .VAR_KEYWORD
343+ if not is_varargs and not is_varkwargs :
344+ func .__signature__ = signature = signature .replace (parameters = [
345+ param .replace (default = _deprecated_parameter ) if param .name == name
346+ else param
347+ for param in signature .parameters .values ()])
342348
343349 @functools .wraps (func )
344- def wrapper (* args , ** kwargs ):
345- arguments = func .__signature__ .bind (* args , ** kwargs ).arguments
350+ def wrapper (* inner_args , ** inner_kwargs ):
351+ arguments = signature .bind (* inner_args , ** inner_kwargs ).arguments
352+ if is_varargs and arguments .get (name ):
353+ warn_deprecated (
354+ since , message = f"Additional positional arguments to "
355+ f"{ func .__name__ } () are deprecated since %(since)s and "
356+ f"support for them will be removed %(removal)s." )
357+ elif is_varkwargs and arguments .get (name ):
358+ warn_deprecated (
359+ since , message = f"Additional keyword arguments to "
360+ f"{ func .__name__ } () are deprecated since %(since)s and "
361+ f"support for them will be removed %(removal)s." )
346362 # We cannot just check `name not in arguments` because the pyplot
347363 # wrappers always pass all arguments explicitly.
348- if name in arguments and arguments [name ] != _deprecated_parameter :
364+ elif name in arguments and arguments [name ] != _deprecated_parameter :
349365 warn_deprecated (
350- since , message = f"The { name !r} parameter of { func .__name__ } () "
351- f"is deprecated since Matplotlib { since } and will be removed "
352- f"%(removal)s. If any parameter follows { name !r} , they "
353- f"should be pass as keyword, not positionally." )
354- return func (* args , ** kwargs )
366+ since ,
367+ name = repr (name ),
368+ obj_type = f"parameter of { func .__name__ } ()" ,
369+ addendum = (f"If any parameter follows { name !r} , they should be "
370+ f"passed as keyword, not positionally." ),
371+ ** kwargs )
372+ return func (* inner_args , ** inner_kwargs )
355373
356374 return wrapper
357375
0 commit comments