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