Порядок диапазонов и сравнение неравенств

Я пытался воссоздать Python range в качестве учебного упражнения, и заметил, что диапазоны имеют атрибут range.__gt__, range.__ge__ и т.д. Он был специально определен в диапазоне, так как диапазон также имеет 8 атрибутов с полным именем object.__...__.

Мне было интересно, для чего используются сравнения диапазонов. Любая попытка range(*x) <= range(*y) поднимает TypeError: unorderable types: range() > range()


person Community    schedule 19.05.2015    source источник


Ответы (1)


Объект диапазона Python 3 определяет следующие подробные сравнения (взятые из 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.

person poke    schedule 19.05.2015
comment
Если это так, то для чего они будут (или планируются) использоваться? - person ; 20.05.2015
comment
Они ни для чего не используются. Именно так должны быть реализованы встроенные объекты. Чтобы поддерживать (любые) методы сравнения, они должны иметь функцию richcompare; и побочным эффектом является то, что вы получаете и другие, которые вам нужно явно отключить. См. также PyTypeObject.tp_richcompare. - person poke; 20.05.2015