@@ -310,7 +310,7 @@ def __repr__(self):
310310_deprecated_parameter = _deprecated_parameter_class ()
311311
312312
313- def _delete_parameter (since , name , func = None ):
313+ def _delete_parameter (since , name , func = None , ** kwargs ):
314314 """
315315 Decorator indicating that parameter *name* of *func* is being deprecated.
316316
@@ -323,6 +323,8 @@ def _delete_parameter(since, name, func=None):
323323 such after the deprecation period has passed and the deprecated parameter
324324 is removed.
325325
326+ Additional kwargs are passed to `.warn_deprecated`.
327+
326328 Examples
327329 --------
328330 ::
@@ -332,29 +334,45 @@ def func(used_arg, other_arg, unused, more_args): ...
332334 """
333335
334336 if func is None :
335- return functools .partial (_delete_parameter , since , name )
337+ return functools .partial (_delete_parameter , since , name , ** kwargs )
336338
337339 signature = inspect .signature (func )
338340 assert name in signature .parameters , (
339341 f"Matplotlib internal error: { name !r} must be a parameter for "
340342 f"{ func .__name__ } ()" )
341- func .__signature__ = signature .replace (parameters = [
342- param .replace (default = _deprecated_parameter ) if param .name == name
343- else param
344- for param in signature .parameters .values ()])
343+ kind = signature .parameters [name ].kind
344+ is_varargs = kind is inspect .Parameter .VAR_POSITIONAL
345+ is_varkwargs = kind is inspect .Parameter .VAR_KEYWORD
346+ if not is_varargs and not is_varkwargs :
347+ func .__signature__ = signature = signature .replace (parameters = [
348+ param .replace (default = _deprecated_parameter ) if param .name == name
349+ else param
350+ for param in signature .parameters .values ()])
345351
346352 @functools .wraps (func )
347- def wrapper (* args , ** kwargs ):
348- arguments = func .__signature__ .bind (* args , ** kwargs ).arguments
353+ def wrapper (* inner_args , ** inner_kwargs ):
354+ arguments = signature .bind (* inner_args , ** inner_kwargs ).arguments
355+ if is_varargs and arguments [name ]:
356+ warn_deprecated (
357+ since , message = f"Additional positional arguments to "
358+ f"{ func .__name__ } () are deprecated since %(since)s and "
359+ f"support for them will be removed %(removal)s." )
360+ elif is_varkwargs and arguments [name ]:
361+ warn_deprecated (
362+ since , message = f"Additional keyword arguments to "
363+ f"{ func .__name__ } () are deprecated since %(since)s and "
364+ f"support for them will be removed %(removal)s." )
349365 # We cannot just check `name not in arguments` because the pyplot
350366 # wrappers always pass all arguments explicitly.
351- if name in arguments and arguments [name ] != _deprecated_parameter :
367+ elif name in arguments and arguments [name ] != _deprecated_parameter :
352368 warn_deprecated (
353- since , message = f"The { name !r} parameter of { func .__name__ } () "
354- f"is deprecated since Matplotlib { since } and will be removed "
355- f"%(removal)s. If any parameter follows { name !r} , they "
356- f"should be pass as keyword, not positionally." )
357- return func (* args , ** kwargs )
369+ since ,
370+ name = repr (name ),
371+ obj_type = f"parameter of { func .__name__ } ()" ,
372+ addendum = (f"If any parameter follows { name !r} , they should be "
373+ f"passed as keyword, not positionally." ),
374+ ** kwargs )
375+ return func (* inner_args , ** inner_kwargs )
358376
359377 return wrapper
360378
0 commit comments