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