2

我试图重新创建 Pythonrange作为学习练习,并注意到 range 具有range.__gt__range.__ge__属性。它是在 range 中专门定义的,因为 range 也有 8 个属性,其限定名称为object.__...__.

我想知道范围比较的用途。任何尝试range(*x) <= range(*y)都会引发TypeError: unorderable types: range() > range()

4

1 回答 1

1

Python 3 range 对象定义了以下丰富的比较(取自C 源代码):

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。

于 2015-05-19T21:12:33.897 回答