学習演習としてPython を再作成しようとしていたところ、範囲に, etc. 属性range
があることに気付きました。範囲には修飾名.range.__gt__
range.__ge__
object.__...__
範囲比較は何に使われるのだろうと思っていました。range(*x) <= range(*y)
レイズしようとすると、TypeError: unorderable types: range() > range()
学習演習としてPython を再作成しようとしていたところ、範囲に, etc. 属性range
があることに気付きました。範囲には修飾名.range.__gt__
range.__ge__
object.__...__
範囲比較は何に使われるのだろうと思っていました。range(*x) <= range(*y)
レイズしようとすると、TypeError: unorderable types: range() > range()
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
。large-equals、large -than などのその他の比較はすべてPy_RETURN_NOTIMPLEMENTED
.