Dave Abrahams wrote:
I am generating extension types derived from a type which is derived from int 'int' by calling the metaclass; in order to prevent instances of the most-derived type from getting an instance _dict_ I am putting an empty tuple in the class _dict_ as '_slots_'. The problem with this hack is that it disables pickling of these babies:
"a class that defines _slots_ without defining _getstate_ cannot be pickled"
Guido van Rossum wrote:
Yes. I was assuming you'd do this at the C level. To do what I suggested in Python, I think you'd have to write this:
class M(type): def __new__(cls, name, bases, dict): C = type.__new__(cls, name, bases, dict) del C.__getstate__ return C
Ok, I'm lost. Please be easy with me, I'm still learning the C API interfacing with Python :) Here's what I have so far. Emulating the desired behavior in Python, I can do:
class EnumMeta(type): def __new__(cls, name, bases, dict): C = type.__new__(cls, name, bases, dict) del C.__getstate__ return C
class Enum(int): __metaclass__ = EnumMeta __slots__ = ()
x = Enum(1964) print x
import pickle print "SAVING" out_x = pickle.dumps(x)
print "LOADING" xl = pickle.loads(out_x) print xl
I'm trying to rewrite this in C/C++ with the intent to patch Boost.Python to allow pickling on enums. I took on this task to learn more about the low level details of Python C interfacing. So far, I have implemented EnumMeta in C that does not override anything yet and installed that as the metaclass of Enum.
I was wondering... Is there some C code somewhere that I can see that implements some sort of meta-stuff? I read PEP253 and 253 and "Unifying Types and Classes in Python 2.2". The examples there (specifically the class autoprop) is written in Python. I tried searching for examples in C from the current CVS snapsot of 2.3 but I failed in doing so. I'm sure it's there, but I don't know where to find.
To be specific, I'm lost in trying to implement tp_new of PyTypeObject. How do I call the default tp_new for metaclasses?