Питон 3 объекта диапазона определяет следующие богатые сравнения (взято из C source):
static PyObject *
range_richcompare(PyObject *self, PyObject *other, int op)
{
int result;
if (!PyRange_Check(other))
Py_RETURN_NOTIMPLEMENTED;
switch (op) {
case Py_NE:
case Py_EQ:
result = range_equals((rangeobject*)self, (rangeobject*)other);
if (result == -1)
return NULL;
if (op == Py_NE)
result = !result;
if (result)
Py_RETURN_TRUE;
else
Py_RETURN_FALSE;
case Py_LE:
case Py_GE:
case Py_LT:
case Py_GT:
Py_RETURN_NOTIMPLEMENTED;
default:
PyErr_BadArgument();
return NULL;
}
}
Как вы можете видеть, только сравнения, которые фактически реализованы являются NE
и EQ
, которые предназначены для неравенства и равенства. Другие сравнения, такие как более крупные, больше, чем и т. Д., - все Py_RETURN_NOTIMPLEMENTED
, поэтому, когда они «технически» реализованы (как во встроенном объекте, определяют методы сравнения), они бросают NotImplementedError.
Если это так, для чего они будут (или планируются)? –
Они не используются ни для чего. Это просто, как встроенные объекты должны быть реализованы. Чтобы поддерживать (любые) методы сравнения, они должны иметь функцию richcompare; и побочный эффект заключается в том, что вы получаете и другие, которые вам необходимо отключить явно. См. Также ['PyTypeObject.tp_richcompare'] (https://docs.python.org/3/c-api/typeobj.html?#c.PyTypeObject.tp_richcompare). – poke