[Python-Dev] Unbinding of methods

Brett Cannon brett at python.org
Thu Jul 19 19:43:52 CEST 2012


The issue is http://bugs.python.org/issue15397 [Stefan accidentally replied
privately to me]

On Thu, Jul 19, 2012 at 1:00 PM, Brett Cannon <brett at python.org> wrote:

>
>
> On Thu, Jul 19, 2012 at 12:53 PM, M Stefan <mstefanro at gmail.com> wrote:
>
>> Hey,
>>
>> As part of pickle4, I found it interesting to add the possibility
>> of pickling bound functions (instance methods). This is done by
>> pickling f.__self__ and f.__func__ separately, and then adding
>> a BIND opcode to tie them together.
>>
>> While this appears to work fine for python methods (non-builtin), some
>> issues arise with builtins. These are partly caused because
>> not all builtin function types support __func__, partly because
>> not all of them fill __module__ when they should and partly
>> because there are many (7) types a function can actually have:
>>
>> ClassMethodDescriptorType = type(??)
>> BuiltinFunctionType = type(len)
>> FunctionType = type(f)
>> MethodType = type(A().f())
>> MethodDescriptorType = type(list.append)
>> WrapperDescriptorType = type(list.__add__)
>> MethodWrapperType = type([].__add__)
>>
>> AllFunctionTypes = (ClassMethodDescriptorType, BuiltinFunctionType,
>>                     FunctionType, MethodType, MethodDescriptorType,
>>                     WrapperDescriptorType, MethodWrapperType)
>> repr(AllFunctionTypes) = (
>>     <class 'classmethod_descriptor'>,
>>     <class 'builtin_function_or_method'>, <class 'function'>,
>>     <class 'method'>, <class 'method_descriptor'>,
>>     <class 'wrapper_descriptor'>, <class 'method-wrapper'>)
>>
>> I have created a patch at [1], which adds __func__ to some other
>> function types, as well as:
>>  1) adds AllFunctionTypes etc. to Lib/types.py
>>  2) inspect.isanyfunction(), inspect.isanyboundfunction(),
>>     inspect.isanyunboundfunction()
>>  3) functools.unbind
>> Note that I am not knowledgeable of cpython internals and therefore
>> the patch needs to be carefully reviewed.
>>
>> Possible issues: Should classmethods be considered bound or unbound?
>> If cm is a classmethod, then should
>> cm.__func__.__self__ = cm.__self__ or cm.__func__.__self__ = None?
>> Currently does the latter:
>>     >>> cm.__self__, hasattr(cm,'__self__'), hasattr(cm.__func__,
>> '__self__')
>>     (<class '__main__.A'>, True, False)
>> This requires treating classmethods separately when pickling,
>> so I'm not sure if this is ideal.
>>
>> Let me know if I should have opened an issue instead. I look
>> forward to hearing your opinions/suggestions on this matter.
>>
>
> Yes, open an issue for your patch and reply here with the issue #.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20120719/c3ce47f5/attachment.html>


More information about the Python-Dev mailing list