On Thu, Jul 19, 2012 at 12:53 PM, M Stefan <mstefa...@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 #.
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to