[pypy-svn] r31199 - in pypy/dist/pypy/module/__builtin__: . test

arigo at codespeak.net arigo at codespeak.net
Wed Aug 9 13:47:07 CEST 2006


Author: arigo
Date: Wed Aug  9 13:47:06 2006
New Revision: 31199

Modified:
   pypy/dist/pypy/module/__builtin__/app_inspect.py
   pypy/dist/pypy/module/__builtin__/test/test_builtin.py
Log:
Eat almost all exceptions in hasattr(), not just AttributeError.
This is a debatable feature of CPython, but our own translation
toolsuite relies on it occasionally, e.g. by doing

    hasattr(random_object, '__name__')

which sometimes gives a TypeError.


Modified: pypy/dist/pypy/module/__builtin__/app_inspect.py
==============================================================================
--- pypy/dist/pypy/module/__builtin__/app_inspect.py	(original)
+++ pypy/dist/pypy/module/__builtin__/app_inspect.py	Wed Aug  9 13:47:06 2006
@@ -85,7 +85,9 @@
     try:
         getattr(obj, attr)
         return True
-    except AttributeError:
+    except (KeyboardInterrupt, SystemExit):
+        raise
+    except:
         return False
 
 # Replaced by the interp-level helper space.callable(): 

Modified: pypy/dist/pypy/module/__builtin__/test/test_builtin.py
==============================================================================
--- pypy/dist/pypy/module/__builtin__/test/test_builtin.py	(original)
+++ pypy/dist/pypy/module/__builtin__/test/test_builtin.py	Wed Aug  9 13:47:06 2006
@@ -417,6 +417,16 @@
         assert Y().f() == ((Y,), {})
         assert Y().f(42, x=43) == ((Y, 42), {'x': 43})
 
+    def test_hasattr(self):
+        class X(object):
+            def broken(): pass
+            abc = property(broken)
+        x = X()
+        x.foo = 42
+        assert hasattr(x, '__class__')
+        assert hasattr(x, 'foo')
+        assert not hasattr(x, 'bar')
+        assert not hasattr(x, 'abc')    # CPython compliance
 
 class TestInternal:
 



More information about the Pypy-commit mailing list