Message392843
Problem
-------
Actual behaviour:
```python
>>> getattr('foobar', 123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: getattr(): attribute name must be string
>>> hasattr('foobar', 123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hasattr(): attribute name must be string
```
Expected behaviour:
```python
>>> getattr('foobar', 123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: attribute name must be string, not 'int'
>>> hasattr('foobar', 123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: attribute name must be string, not 'int'
```
Motivation:
```python
>>> setattr('foobar', 123, 'baz')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: attribute name must be string, not 'int'
>>> delattr('foobar', 123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: attribute name must be string, not 'int'
```
Solution
--------
In the function `builtin_getattr` defined in Python/bltinmodule.c, we remove the following lines:
```c
if (!PyUnicode_Check(name)) {
PyErr_SetString(PyExc_TypeError,
"getattr(): attribute name must be string");
return NULL;
}
```
because the expected `TypeError` message is already implemented in the subsequent call to the functions `_PyObject_LookupAttr` and `PyObject_GetAttr` defined in Objects/object.c:
```c
PyObject *
PyObject_GetAttr(PyObject *v, PyObject *name)
{
PyTypeObject *tp = Py_TYPE(v);
if (!PyUnicode_Check(name)) {
PyErr_Format(PyExc_TypeError,
"attribute name must be string, not '%.200s'",
Py_TYPE(name)->tp_name);
return NULL;
}
[…]
int
_PyObject_LookupAttr(PyObject *v, PyObject *name, PyObject **result)
{
PyTypeObject *tp = Py_TYPE(v);
if (!PyUnicode_Check(name)) {
PyErr_Format(PyExc_TypeError,
"attribute name must be string, not '%.200s'",
Py_TYPE(name)->tp_name);
*result = NULL;
return -1;
}
[…]
```
Likewise, in the function `builtin_hasattr_impl` defined in Python/bltinmodule.c, we remove the following lines:
```c
if (!PyUnicode_Check(name)) {
PyErr_SetString(PyExc_TypeError,
"hasattr(): attribute name must be string");
return NULL;
}
```
because the expected `TypeError` message is already implemented in the subsequent call to the function `_PyObject_LookupAttr` defined in Objects/object.c. |
|
Date |
User |
Action |
Args |
2021-05-03 22:50:44 | maggyero | set | recipients:
+ maggyero |
2021-05-03 22:50:44 | maggyero | set | messageid: <1620082244.42.0.641033791104.issue44024@roundup.psfhosted.org> |
2021-05-03 22:50:44 | maggyero | link | issue44024 messages |
2021-05-03 22:50:44 | maggyero | create | |
|