Author: guido.van.rossum
Date: Thu Aug  2 18:48:17 2007
New Revision: 56672

Modified:
   python/branches/py3k-struni/Lib/test/test_metaclass.py
   python/branches/py3k-struni/Objects/typeobject.c
Log:
Add a default __prepare__() method to 'type', so it can be called
using super().  (See recent conversation on python-3000 with Talin
and Phillip Eby about PEP 3115 chaining rules.)


Modified: python/branches/py3k-struni/Lib/test/test_metaclass.py
==============================================================================
--- python/branches/py3k-struni/Lib/test/test_metaclass.py      (original)
+++ python/branches/py3k-struni/Lib/test/test_metaclass.py      Thu Aug  2 
18:48:17 2007
@@ -207,6 +207,29 @@
     kw: [('other', 'booh')]
     >>>
 
+The default metaclass must define a __prepare__() method.
+
+    >>> type.__prepare__()
+    {}
+    >>>
+
+Make sure it works with subclassing.
+
+    >>> class M(type):
+    ...     @classmethod
+    ...     def __prepare__(cls, *args, **kwds):
+    ...         d = super().__prepare__(*args, **kwds)
+    ...         d["hello"] = 42
+    ...         return d
+    ...
+    >>> class C(metaclass=M):
+    ...     print(hello)
+    ...
+    42
+    >>> print(C.hello)
+    42
+    >>>
+
 """
 
 __test__ = {'doctests' : doctests}

Modified: python/branches/py3k-struni/Objects/typeobject.c
==============================================================================
--- python/branches/py3k-struni/Objects/typeobject.c    (original)
+++ python/branches/py3k-struni/Objects/typeobject.c    Thu Aug  2 18:48:17 2007
@@ -2200,11 +2200,21 @@
        return list;
 }
 
+static PyObject *
+type_prepare(PyObject *self, PyObject *args, PyObject *kwds)
+{
+       return PyDict_New();
+}
+
 static PyMethodDef type_methods[] = {
        {"mro", (PyCFunction)mro_external, METH_NOARGS,
         PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
        {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
         PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
+        {"__prepare__", (PyCFunction)type_prepare,
+        METH_VARARGS | METH_KEYWORDS | METH_CLASS,
+         PyDoc_STR("__prepare__() -> dict\n"
+                   "used to create the namespace for the class statement")},
        {0}
 };
 
_______________________________________________
Python-3000-checkins mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000-checkins

Reply via email to