[pypy-svn] r5610 - in pypy/trunk/src/pypy/module: . test

arigo at codespeak.net arigo at codespeak.net
Thu Jul 22 17:31:41 CEST 2004


Author: arigo
Date: Thu Jul 22 17:31:40 2004
New Revision: 5610

Modified:
   pypy/trunk/src/pypy/module/__builtin__interp.py
   pypy/trunk/src/pypy/module/__builtin__module.py
   pypy/trunk/src/pypy/module/test/test_builtin.py
Log:
isinstance() and issubclass() behave better.  Tests added.
isinstance() now checks with type() first, and with .__class__ next.


Modified: pypy/trunk/src/pypy/module/__builtin__interp.py
==============================================================================
--- pypy/trunk/src/pypy/module/__builtin__interp.py	(original)
+++ pypy/trunk/src/pypy/module/__builtin__interp.py	Thu Jul 22 17:31:40 2004
@@ -280,7 +280,7 @@
 
 #XXX works only for new-style classes.
 #So we have to fix it, when we add support for old-style classes
-def issubclass(w_cls1, w_cls2):
+def _issubtype(w_cls1, w_cls2):
     return space.issubtype(w_cls1, w_cls2)
 
 def iter(w_collection_or_callable, w_sentinel = _noarg):

Modified: pypy/trunk/src/pypy/module/__builtin__module.py
==============================================================================
--- pypy/trunk/src/pypy/module/__builtin__module.py	(original)
+++ pypy/trunk/src/pypy/module/__builtin__module.py	Thu Jul 22 17:31:40 2004
@@ -182,21 +182,26 @@
          break
     return initial
 
+def issubclass(cls, klass_or_tuple):
+    if _issubtype(type(klass_or_tuple), tuple):
+        for klass in klass_or_tuple:
+            if issubclass(cls, klass):
+                return True
+        return False
+    try:
+        return _issubtype(cls, klass_or_tuple)
+    except TypeError:
+        raise TypeError, "arg 2 must be a class or type or a tuple thereof"
+
 def isinstance(obj, klass_or_tuple):
+    if issubclass(type(obj), klass_or_tuple):
+        return True
     try:
         objcls = obj.__class__
     except AttributeError:
-        objcls = type(obj)
-    if issubclass(klass_or_tuple.__class__, tuple):
-       for klass in klass_or_tuple:
-           if issubclass(objcls, klass):
-              return 1
-       return 0
+        return False
     else:
-       try:
-           return issubclass(objcls, klass_or_tuple)
-       except TypeError:
-           raise TypeError, "isinstance() arg 2 must be a class or type"
+        return objcls is not type(obj) and issubclass(objcls, klass_or_tuple)
 
 def range(x, y=None, step=1):
     """ returns a list of integers in arithmetic position from start (defaults
@@ -443,7 +448,7 @@
 from __interplevel__ import abs, chr, len, ord, pow, repr
 from __interplevel__ import hash, oct, hex, round
 from __interplevel__ import getattr, setattr, delattr, iter, hash, id
-from __interplevel__ import issubclass
+from __interplevel__ import _issubtype
 from __interplevel__ import compile, eval
 from __interplevel__ import globals, locals, _caller_globals, _caller_locals
 

Modified: pypy/trunk/src/pypy/module/test/test_builtin.py
==============================================================================
--- pypy/trunk/src/pypy/module/test/test_builtin.py	(original)
+++ pypy/trunk/src/pypy/module/test/test_builtin.py	Thu Jul 22 17:31:40 2004
@@ -238,6 +238,27 @@
         self.assertRaises(ValueError, compile, '1+2', '?', 'maybenot')
         self.assertRaises(TypeError, compile, '1+2', 12, 34)
 
+    def test_isinstance(self):
+        self.assert_(isinstance(5, int))
+        self.assert_(isinstance(5, object))
+        self.assert_(not isinstance(5, float))
+        self.assert_(isinstance(True, (int, float)))
+        self.assert_(not isinstance(True, (type, float)))
+        self.assert_(isinstance(True, ((type, float), bool)))
+        self.assertRaises(TypeError, isinstance, 5, 6)
+        self.assertRaises(TypeError, isinstance, 5, (float, 6))
+
+    def test_issubclass(self):
+        self.assert_(issubclass(int, int))
+        self.assert_(issubclass(int, object))
+        self.assert_(not issubclass(int, float))
+        self.assert_(issubclass(bool, (int, float)))
+        self.assert_(not issubclass(bool, (type, float)))
+        self.assert_(issubclass(bool, ((type, float), bool)))
+        self.assertRaises(TypeError, issubclass, 5, int)
+        self.assertRaises(TypeError, issubclass, int, 6)
+        self.assertRaises(TypeError, issubclass, int, (float, 6))
+
         
 class TestInternal(testit.IntTestCase):
 



More information about the Pypy-commit mailing list