[pypy-svn] r11532 - in pypy/dist/pypy/objspace/std: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Apr 27 17:53:43 CEST 2005
Author: arigo
Date: Wed Apr 27 17:53:43 2005
New Revision: 11532
Modified:
pypy/dist/pypy/objspace/std/test/test_typeobject.py
pypy/dist/pypy/objspace/std/typeobject.py
Log:
Made the app-level abstract_mro() sufficiently RPythonic.
This prevented new-style classes from inheriting from old-style ones (added a
test for that).
Modified: pypy/dist/pypy/objspace/std/test/test_typeobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_typeobject.py (original)
+++ pypy/dist/pypy/objspace/std/test/test_typeobject.py Wed Apr 27 17:53:43 2005
@@ -155,6 +155,15 @@
assert getattr(B_mro, 'a', None) == None
assert getattr(B_mro(), 'a', None) == None
+ def test_abstract_mro(self):
+ class A1:
+ __metaclass__ = _classobj
+ class A2(A1):
+ pass
+ class A3(A2, object):
+ __metaclass__ = type
+ assert A3.__mro__ == (A3, A2, A1, object)
+
def test_nodoc(self):
class NoDoc(object):
pass
Modified: pypy/dist/pypy/objspace/std/typeobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/typeobject.py (original)
+++ pypy/dist/pypy/objspace/std/typeobject.py Wed Apr 27 17:53:43 2005
@@ -282,14 +282,13 @@
abstract_mro = gateway.applevel("""
def abstract_mro(klass):
# abstract/classic mro
- mro = []
- def fill_mro(klass):
- if klass not in mro:
- mro.append(klass)
- assert isinstance(klass.__bases__, tuple)
+ mro = [klass]
+ for klass in mro:
+ if not isinstance(klass.__bases__, tuple):
+ raise TypeError, '__bases__ must be a tuple'
for base in klass.__bases__:
- fill_mro(base)
- fill_mro(klass)
+ if base not in mro:
+ mro.append(base)
return mro
""", filename=__file__).interphook("abstract_mro")
More information about the Pypy-commit
mailing list