[pypy-svn] r57079 - in pypy/branch/isinstance-refactor/pypy/module/__builtin__: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Aug 7 19:14:04 CEST 2008
Author: arigo
Date: Thu Aug 7 19:13:58 2008
New Revision: 57079
Modified:
pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py
pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py
Log:
Logic for subclass detection in old-style classes.
Modified: pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py
==============================================================================
--- pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py (original)
+++ pypy/branch/isinstance-refactor/pypy/module/__builtin__/interp_classobj.py Thu Aug 7 19:13:58 2008
@@ -85,6 +85,16 @@
space.wrap("__bases__ items must be classes"))
self.bases_w = bases_w
+ def is_subclass_of(self, other):
+ assert isinstance(other, W_ClassObject)
+ if self is other:
+ return True
+ for base in self.bases_w:
+ assert isinstance(base, W_ClassObject)
+ if base.is_subclass_of(other):
+ return True
+ return False
+
def lookup(self, space, w_attr):
# returns w_value or interplevel None
w_result = space.finditem(self.w_dict, w_attr)
Modified: pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py
==============================================================================
--- pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py (original)
+++ pypy/branch/isinstance-refactor/pypy/module/__builtin__/test/test_classobj.py Thu Aug 7 19:13:58 2008
@@ -15,6 +15,35 @@
assert a.__class__ is A
assert a.__dict__ == {'b': 2}
+ def test_isinstance(self):
+ class A:
+ pass
+ class B(A):
+ pass
+ class C(A):
+ pass
+ assert isinstance(B(), A)
+ assert isinstance(B(), B)
+ assert not isinstance(B(), C)
+ assert not isinstance(A(), B)
+ assert isinstance(B(), (A, C))
+ assert isinstance(B(), (C, (), (C, B)))
+ assert not isinstance(B(), ())
+
+ def test_issubclass(self):
+ class A:
+ pass
+ class B(A):
+ pass
+ class C(A):
+ pass
+ assert issubclass(A, A)
+ assert not issubclass(A, B)
+ assert not issubclass(A, C)
+ assert issubclass(B, A)
+ assert issubclass(B, B)
+ assert not issubclass(B, C)
+
def test_mutate_class_special(self):
class A:
a = 1
More information about the Pypy-commit
mailing list