Mutable defaults
Terry Reedy
tjreedy at udel.edu
Tue Feb 9 12:17:17 EST 2021
On 2/9/2021 10:17 AM, Antoon Pardon wrote:
> Most of us know of the perils of mutable default values. So I came up
> with the following proof of concept:
Which is intended to do what?
> from inspect import signature as signature_of, Parameter
> from itertools import zip_longest
> from copy import copy
>
> def copy_defaults(f):
Docstring?
> signature = signature_of(f)
>
> def wrapper(*args):
> newargs = []
> for argument, parameter_item in zip_longest(args,
> signature.parameters.items(), fillvalue = Parameter.empty):
> _, parameter = parameter_item
> if argument is not Parameter.empty:
> newargs.append(argument)
> elif (parameter.default is not Parameter.empty):
> newargs.append(copy(parameter.default))
> else:
> raise TypeError("Not enough arguments")
> return f(*newargs)
>
> return wrapper
>
> @copy_defaults
> def prepare(value, lst = []):
> for vl in range(value):
> lst.append(vl)
> return lst
>
> print(prepare(2))
> print(prepare(3))
>
> Running the above will produce:
>
> [0, 1]
> [0, 1, 2]
>
>
--
Terry Jan Reedy
More information about the Python-list
mailing list