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