Mutable defaults
Antoon Pardon
antoon.pardon at vub.be
Tue Feb 9 10:17:12 EST 2021
Most of us know of the perils of mutable default values. So I came up with the following proof of concept:
from inspect import signature as signature_of, Parameter
from itertools import zip_longest
from copy import copy
def copy_defaults(f):
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]
More information about the Python-list
mailing list