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 <br...@python.org> wrote: > > > 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