[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