Function __defaults__

Steven D'Aprano steve+comp.lang.python at
Mon Apr 25 04:00:53 CEST 2011

On Sun, 24 Apr 2011 10:07:02 -0700, Ken Seehart wrote:

> On 4/24/2011 2:58 AM, Steven D'Aprano wrote:
>> Is this an accident of implementation, or can I trust that changing
>> function defaults in this fashion is guaranteed to work?
> This is documented in python 3, so I would expect it to be stable (until
> python 4, that is)

Thanks to everyone who replied. Obviously my google-foo was weak 
yesterday, because I did search for an answer.

However, __getitem__ appears to be ignored when looking up defaults:

>>> class Magic(tuple):
...     def __getitem__(self, i):
...         print("magic!")
...         return super().__getitem__(i)
>>> def f(a, b=2):
...     return a+b
>>> f.__defaults__ = Magic(f.__defaults__)
>>> f.__defaults__[0]
>>> f(40)

Which is a pity, because I had an awesome idea for a hack to "fix" the 
mutable default function argument gotcha with a decorator, but 
unfortunately it relies on __getitem__ being called.

def fixed_default(func):
    class Magic(tuple):
        def __getitem__(self, i):
            x = super().__getitem__(i)
            if x == []:
                return list()
            return x
    func.__defaults__ = Magic(func.__defaults__)
    return func


More information about the Python-list mailing list