In the current Python, __getattribute__ can be called directly with a non-string, causing much weirdness: >>> print ''.__getattribute__(1) Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: 'str' object has no attribute ' =E4=B7*' >>>=20 To avoid this, i've added a simple check to Objects/object.c: diff -c -r2.161 object.c *** object.c 2001/11/04 07:29:31 2.161 --- object.c 2001/12/04 12:46:13 *************** *** 1210,1215 **** --- 1210,1221 ---- descrgetfunc f; PyObject **dictptr; =20 + if (!PyString_Check(name)) { + PyErr_SetString(PyExc_TypeError, + "attribute name must be string"); + return NULL; + } +=20 if (tp->tp_dict =3D=3D NULL) { if (PyType_Ready(tp) < 0) return NULL; This produces the better behaviour: >>> print ''.__getattribute__(1) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: attribute name must be string >>>=20 I was about to check in this simple fix -- but then i discovered that it is currently possible to assign attributes with non-string keys: >>> def f(): pass ...=20 >>> f.__getattribute__(1) Traceback (most recent call last): File "<stdin>", line 1, in ? AttributeError: 'function' object has no attribute ' =E4=B7*' >>> f.__setattr__(1, 1) >>> f.__getattribute__(1) 1 >>>=20 Adding the above check prevents this usage. Is there any reason why people should be allowed to assign and retrieve attributes with non-string names? -- ?!ng
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4