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] -- https://mail.python.org/mailman/listinfo/python-list