mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Anti-registration of various ABC methods.
- Issue #25958: Support "anti-registration" of special methods from various ABCs, like __hash__, __iter__ or __len__. All these (and several more) can be set to None in an implementation class and the behavior will be as if the method is not defined at all. (Previously, this mechanism existed only for __hash__, to make mutable classes unhashable.) Code contributed by Andrew Barnert and Ivan Levkivskyi.
This commit is contained in:
parent
0a6996d87d
commit
97c1adf393
15 changed files with 300 additions and 62 deletions
|
@ -250,6 +250,13 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return NULL;
|
||||
|
||||
reversed_meth = _PyObject_LookupSpecial(seq, &PyId___reversed__);
|
||||
if (reversed_meth == Py_None) {
|
||||
Py_DECREF(reversed_meth);
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"'%.200s' object is not reversible",
|
||||
Py_TYPE(seq)->tp_name);
|
||||
return NULL;
|
||||
}
|
||||
if (reversed_meth != NULL) {
|
||||
PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
|
||||
Py_DECREF(reversed_meth);
|
||||
|
@ -259,8 +266,9 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|||
return NULL;
|
||||
|
||||
if (!PySequence_Check(seq)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"argument to reversed() must be a sequence");
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"'%.200s' object is not reversible",
|
||||
Py_TYPE(seq)->tp_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue