only catch AttributeError in hasattr() #9666

This commit is contained in:
Benjamin Peterson 2010-08-24 03:26:23 +00:00
parent 9cf5ef4cc0
commit 17689991e6
5 changed files with 19 additions and 17 deletions

View File

@ -463,10 +463,10 @@ are always available. They are listed here in alphabetical order.
.. function:: hasattr(object, name)
The arguments are an object and a string. The result is ``True`` if the string
is the name of one of the object's attributes, ``False`` if not. (This is
implemented by calling ``getattr(object, name)`` and seeing whether it raises an
exception or not.)
The arguments are an object and a string. The result is ``True`` if the
string is the name of one of the object's attributes, ``False`` if not. (This
is implemented by calling ``getattr(object, name)`` and seeing whether it
raises an :exc:`AttributeError` or not.)
.. function:: hash(object)

View File

@ -495,15 +495,16 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(TypeError, hasattr)
self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
# Check that hasattr allows SystemExit and KeyboardInterrupts by
# Check that hasattr propagates all exceptions outside of
# AttributeError.
class A:
def __getattr__(self, what):
raise KeyboardInterrupt
self.assertRaises(KeyboardInterrupt, hasattr, A(), "b")
raise SystemExit
self.assertRaises(SystemExit, hasattr, A(), "b")
class B:
def __getattr__(self, what):
raise SystemExit
self.assertRaises(SystemExit, hasattr, B(), "b")
raise ValueError
self.assertRaises(ValueError, hasattr, B(), "b")
def test_hash(self):
hash(None)

View File

@ -730,6 +730,7 @@ Steven Scott
Barry Scott
Nick Seidenman
Žiga Seilnach
Yury Selivanov
Fred Sells
Jiwon Seo
Roger D. Serwy

View File

@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 2?
Core and Builtins
-----------------
- Issue #9666: Only catch AttributeError in hasattr(). All other exceptions that
occur during attribute lookup are now propagated to the caller.
- Issue #8622: Add PYTHONFSENCODING environment variable to override the
filesystem encoding.

View File

@ -893,24 +893,21 @@ builtin_hasattr(PyObject *self, PyObject *args)
}
v = PyObject_GetAttr(v, name);
if (v == NULL) {
if (!PyErr_ExceptionMatches(PyExc_Exception))
return NULL;
else {
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
PyErr_Clear();
Py_INCREF(Py_False);
return Py_False;
Py_RETURN_FALSE;
}
return NULL;
}
Py_DECREF(v);
Py_INCREF(Py_True);
return Py_True;
Py_RETURN_TRUE;
}
PyDoc_STRVAR(hasattr_doc,
"hasattr(object, name) -> bool\n\
\n\
Return whether the object has an attribute with the given name.\n\
(This is done by calling getattr(object, name) and catching exceptions.)");
(This is done by calling getattr(object, name) and catching AttributeError.)");
static PyObject *