2015-05-19 2 views
2

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

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

ответ

1

Питон 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.

+0

Если это так, для чего они будут (или планируются)? –

+0

Они не используются ни для чего. Это просто, как встроенные объекты должны быть реализованы. Чтобы поддерживать (любые) методы сравнения, они должны иметь функцию richcompare; и побочный эффект заключается в том, что вы получаете и другие, которые вам необходимо отключить явно. См. Также ['PyTypeObject.tp_richcompare'] (https://docs.python.org/3/c-api/typeobj.html?#c.PyTypeObject.tp_richcompare). – poke

Смежные вопросы