Nested Function Question

David Robinow drobinow at gmail.com
Sat Jan 7 10:18:15 EST 2012


On Fri, Jan 6, 2012 at 5:04 PM, Ian Kelly <ian.g.kelly at gmail.com> wrote:
> On Fri, Jan 6, 2012 at 2:46 PM, GZ <zyzhu2000 at gmail.com> wrote:
>> Hi,
>>
>> I am reading the documentation of functools.partial (http://
>> docs.python.org/library/functools.html#functools.partial) and found
>> the following 'reference implementation' of functools.partial.
>>
>> def partial(func, *args, **keywords):
>>    def newfunc(*fargs, **fkeywords):
>>        newkeywords = keywords.copy()
>>        newkeywords.update(fkeywords)
>>        return func(*(args + fargs), **newkeywords)
>>    newfunc.func = func
>>    newfunc.args = args
>>    newfunc.keywords = keywords
>>    return newfunc
>>
>> I don't understand why the below 3 lines are needed:
>>
>>    newfunc.func = func
>>    newfunc.args = args
>>    newfunc.keywords = keywords
>>
>>
>> It is as if they are trying to prevent garbage collection, but I don't
>> get why it is needed. As long as something holds reference to newfunc,
>> because it in turn references keywords and args, nothing will be
>> freed. If nothing is referencing newfunc, then everything should be
>> freed.
>
> They exist for introspection.  The partial object has to store the
> function and arguments it was passed so that it can call it later, so
> as long as they're being stored anyway, why not make them visible?
I tend toward the minimalist end of the spectrum when it comes to code
commenting, but it seems to me this would be a good place for a few
words of explanation.



More information about the Python-list mailing list