mirror of
https://github.com/python/cpython.git
synced 2025-09-08 01:41:19 +00:00
bpo-44024: Improve the TypeError message in getattr and hasattr (GH-25863)
Use common error message for non-string attribute name in the builtin functions getattr and hasattr. The special check no longer needed since Python 3.0.
This commit is contained in:
parent
60ceedbdd5
commit
16bf9bd157
3 changed files with 16 additions and 14 deletions
|
@ -509,6 +509,9 @@ class BuiltinTest(unittest.TestCase):
|
|||
sys.spam = 1
|
||||
delattr(sys, 'spam')
|
||||
self.assertRaises(TypeError, delattr)
|
||||
self.assertRaises(TypeError, delattr, sys)
|
||||
msg = r"^attribute name must be string, not 'int'$"
|
||||
self.assertRaisesRegex(TypeError, msg, delattr, sys, 1)
|
||||
|
||||
def test_dir(self):
|
||||
# dir(wrong number of arguments)
|
||||
|
@ -801,17 +804,21 @@ class BuiltinTest(unittest.TestCase):
|
|||
|
||||
def test_getattr(self):
|
||||
self.assertTrue(getattr(sys, 'stdout') is sys.stdout)
|
||||
self.assertRaises(TypeError, getattr, sys, 1)
|
||||
self.assertRaises(TypeError, getattr, sys, 1, "foo")
|
||||
self.assertRaises(TypeError, getattr)
|
||||
self.assertRaises(TypeError, getattr, sys)
|
||||
msg = r"^attribute name must be string, not 'int'$"
|
||||
self.assertRaisesRegex(TypeError, msg, getattr, sys, 1)
|
||||
self.assertRaisesRegex(TypeError, msg, getattr, sys, 1, 'spam')
|
||||
self.assertRaises(AttributeError, getattr, sys, chr(sys.maxunicode))
|
||||
# unicode surrogates are not encodable to the default encoding (utf8)
|
||||
self.assertRaises(AttributeError, getattr, 1, "\uDAD1\uD51E")
|
||||
|
||||
def test_hasattr(self):
|
||||
self.assertTrue(hasattr(sys, 'stdout'))
|
||||
self.assertRaises(TypeError, hasattr, sys, 1)
|
||||
self.assertRaises(TypeError, hasattr)
|
||||
self.assertRaises(TypeError, hasattr, sys)
|
||||
msg = r"^attribute name must be string, not 'int'$"
|
||||
self.assertRaisesRegex(TypeError, msg, hasattr, sys, 1)
|
||||
self.assertEqual(False, hasattr(sys, chr(sys.maxunicode)))
|
||||
|
||||
# Check that hasattr propagates all exceptions outside of
|
||||
|
@ -1457,8 +1464,11 @@ class BuiltinTest(unittest.TestCase):
|
|||
def test_setattr(self):
|
||||
setattr(sys, 'spam', 1)
|
||||
self.assertEqual(sys.spam, 1)
|
||||
self.assertRaises(TypeError, setattr, sys, 1, 'spam')
|
||||
self.assertRaises(TypeError, setattr)
|
||||
self.assertRaises(TypeError, setattr, sys)
|
||||
self.assertRaises(TypeError, setattr, sys, 'spam')
|
||||
msg = r"^attribute name must be string, not 'int'$"
|
||||
self.assertRaisesRegex(TypeError, msg, setattr, sys, 1, 'spam')
|
||||
|
||||
# test_str(): see test_unicode.py and test_bytes.py for str() tests.
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Improve the exc:`TypeError` message for non-string second arguments passed to
|
||||
the built-in functions :func:`getattr` and :func:`hasattr`. Patch by Géry Ogam.
|
|
@ -1091,11 +1091,6 @@ builtin_getattr(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
|
|||
|
||||
v = args[0];
|
||||
name = args[1];
|
||||
if (!PyUnicode_Check(name)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"getattr(): attribute name must be string");
|
||||
return NULL;
|
||||
}
|
||||
if (nargs > 2) {
|
||||
if (_PyObject_LookupAttr(v, name, &result) == 0) {
|
||||
PyObject *dflt = args[2];
|
||||
|
@ -1156,11 +1151,6 @@ builtin_hasattr_impl(PyObject *module, PyObject *obj, PyObject *name)
|
|||
{
|
||||
PyObject *v;
|
||||
|
||||
if (!PyUnicode_Check(name)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"hasattr(): attribute name must be string");
|
||||
return NULL;
|
||||
}
|
||||
if (_PyObject_LookupAttr(obj, name, &v) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue