@@ -309,7 +309,7 @@ def __repr__(self):
309309_deprecated_parameter = _deprecated_parameter_class ()
310310
311311
312- def _delete_parameter (since , name , func = None ):
312+ def _delete_parameter (since , name , func = None , ** kwargs ):
313313 """
314314 Decorator indicating that parameter *name* of *func* is being deprecated.
315315
@@ -322,6 +322,8 @@ def _delete_parameter(since, name, func=None):
322322 such after the deprecation period has passed and the deprecated parameter
323323 is removed.
324324
325+ Additional kwargs are passed to `.warn_deprecated`.
326+
325327 Examples
326328 --------
327329 ::
@@ -330,29 +332,45 @@ def func(used_arg, other_arg, unused, more_args): ...
330332 """
331333
332334 if func is None :
333- return functools .partial (_delete_parameter , since , name )
335+ return functools .partial (_delete_parameter , since , name , ** kwargs )
334336
335337 signature = inspect .signature (func )
336338 assert name in signature .parameters , (
337339 f"Matplotlib internal error: { name !r} must be a parameter for "
338340 f"{ func .__name__ } ()" )
339- func .__signature__ = signature .replace (parameters = [
340- param .replace (default = _deprecated_parameter ) if param .name == name
341- else param
342- for param in signature .parameters .values ()])
341+ kind = signature .parameters [name ].kind
342+ is_varargs = kind is inspect .Parameter .VAR_POSITIONAL
343+ is_varkwargs = kind is inspect .Parameter .VAR_KEYWORD
344+ if not is_varargs and not is_varkwargs :
345+ func .__signature__ = signature = signature .replace (parameters = [
346+ param .replace (default = _deprecated_parameter ) if param .name == name
347+ else param
348+ for param in signature .parameters .values ()])
343349
344350 @functools .wraps (func )
345- def wrapper (* args , ** kwargs ):
346- arguments = func .__signature__ .bind (* args , ** kwargs ).arguments
351+ def wrapper (* inner_args , ** inner_kwargs ):
352+ arguments = signature .bind (* inner_args , ** inner_kwargs ).arguments
353+ if is_varargs and arguments [name ]:
354+ warn_deprecated (
355+ since , message = f"Additional positional arguments to "
356+ f"{ func .__name__ } () are deprecated since %(since)s and "
357+ f"support for them will be removed %(removal)s." )
358+ elif is_varkwargs and arguments [name ]:
359+ warn_deprecated (
360+ since , message = f"Additional keyword arguments to "
361+ f"{ func .__name__ } () are deprecated since %(since)s and "
362+ f"support for them will be removed %(removal)s." )
347363 # We cannot just check `name not in arguments` because the pyplot
348364 # wrappers always pass all arguments explicitly.
349- if name in arguments and arguments [name ] != _deprecated_parameter :
365+ elif name in arguments and arguments [name ] != _deprecated_parameter :
350366 warn_deprecated (
351- since , message = f"The { name !r} parameter of { func .__name__ } () "
352- f"is deprecated since Matplotlib { since } and will be removed "
353- f"%(removal)s. If any parameter follows { name !r} , they "
354- f"should be pass as keyword, not positionally." )
355- return func (* args , ** kwargs )
367+ since ,
368+ name = repr (name ),
369+ obj_type = f"parameter of { func .__name__ } ()" ,
370+ addendum = (f"If any parameter follows { name !r} , they should be "
371+ f"passed as keyword, not positionally." ),
372+ ** kwargs )
373+ return func (* inner_args , ** inner_kwargs )
356374
357375 return wrapper
358376
0 commit comments