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

Reply via email to