【问题标题】:Range ordering and inequality comparison范围排序和不等式比较
【发布时间】:2015-05-20 05:12:33
【问题描述】:

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

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

【问题讨论】:

    标签: python-3.x range inequality


    【解决方案1】:

    Python 3 range 对象定义了以下丰富的比较(取自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;
        }
    }
    

    如您所见,实际实现的唯一比较是 NEEQ,它们用于不等式和相等性。其他比较,如大于等于、大于等,都是Py_RETURN_NOTIMPLEMENTED,因此虽然它们是“技术上”实现的(如在内置对象中定义了比较方法),但它们会抛出 NotImplementedError。

    【讨论】:

    • 如果是这种情况,它们将用于(或计划用于)什么?
    • 它们不用于任何事情。这就是必须如何实现内置对象。为了支持(任何)比较方法,它们需要有丰富的比较功能;副作用是你也得到了我需要明确禁用的其他那些。另请参阅PyTypeObject.tp_richcompare
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多