范围排序和不等式比较
Range ordering and inequality comparison
我试图重新创建 Python 的 range
作为学习练习,并注意到范围具有 range.__gt__
、range.__ge__
等属性。它是在range中专门定义的,因为range也有8个属性,限定名称为object.__...__
.
我想知道范围比较的用途。任何 range(*x) <= range(*y)
的尝试都会引发 TypeError: unorderable types: range() > range()
Python 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。
我试图重新创建 Python 的 range
作为学习练习,并注意到范围具有 range.__gt__
、range.__ge__
等属性。它是在range中专门定义的,因为range也有8个属性,限定名称为object.__...__
.
我想知道范围比较的用途。任何 range(*x) <= range(*y)
的尝试都会引发 TypeError: unorderable types: range() > range()
Python 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。