STINNER Victor <[email protected]> added the comment:
Let me propose a flag name: Py_TPFLAGS_IMMUTABLE.
Py_TPFLAGS_IMMUTABLE implies that setattr(type, name, value) fails. A type has
a dictionary, but it cannot be modified with type.__dict__[name] = value, since
type.__dict__ returns a read-only mapping proxy.
Currently, the limitation of not being able to modify a built-in type is
arbitrary, it's not a technical limitation. It is implemented in
type_setattro() which is the default implementation of tp_setattro:
PyType_Type.tp_setattro = type_setattro.
Not having Py_TPFLAGS_HEAPTYPE flag implies "immutable". I suggest to add a new
Py_TPFLAGS_IMMUTABLE flag and modify PyType_Ready() to use the flag if
Py_TPFLAGS_HEAPTYPE is not set:
if (!(flags & Py_TPFLAGS_HEAPTYPE)) {
flags |= Py_TPFLAGS_IMMUTABLE;
}
You can try with this change:
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 254d12cc97..4bd02d40c1 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3875,13 +3875,6 @@ static int
type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
{
int res;
- if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
- PyErr_Format(
- PyExc_TypeError,
- "can't set attributes of built-in/extension type '%s'",
- type->tp_name);
- return -1;
- }
if (PyUnicode_Check(name)) {
if (PyUnicode_CheckExact(name)) {
if (PyUnicode_READY(name) == -1)
It becomes possible to modify built-in types:
$ ./python
Python 3.10.0a7+ (heads/master-dirty:cdad2724e6, Apr 22 2021, 14:44:44) [GCC
10.2.1 20201125 (Red Hat 10.2.1-9)] on linux
>>> str.x=1
>>> str.x
1
>>> del str.x
>>> del str.__repr__
>>> del str.__repr__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __repr__
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue43908>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com