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


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to