This improves the lives of type annotation users of `float` - which type checkers implicitly treat as `int|float` because that is what most code actually wants. Before this change a `.is_integer()` method could not be assumed to exist on things annotated as `: float` due to the method not existing on both types.
.. versionadded:: 3.8
+.. method:: int.is_integer()
+
+ Returns ``True``. Exists for duck type compatibility with :meth:`float.is_integer`.
+
+ .. versionadded:: 3.12
+
Additional Methods on Float
---------------------------
b = i.to_bytes(2, signed=True)
self.assertIs(int.from_bytes(b, signed=True), i)
+ def test_is_integer(self):
+ self.assertTrue((-1).is_integer())
+ self.assertTrue((0).is_integer())
+ self.assertTrue((1).is_integer())
+
def test_access_to_nonexistent_digit_0(self):
# http://bugs.python.org/issue14630: A bug in _PyLong_Copy meant that
# ob_digit[0] was being incorrectly accessed for instances of a
--- /dev/null
+Add :meth:`int.is_integer` to improve duck type compatibility between :class:`int` and :class:`float`.
exit:
return return_value;
}
-/*[clinic end generated code: output=bf6074ecf2f32cf4 input=a9049054013a1b77]*/
+
+PyDoc_STRVAR(int_is_integer__doc__,
+"is_integer($self, /)\n"
+"--\n"
+"\n"
+"Returns True. Exists for duck type compatibility with float.is_integer.");
+
+#define INT_IS_INTEGER_METHODDEF \
+ {"is_integer", (PyCFunction)int_is_integer, METH_NOARGS, int_is_integer__doc__},
+
+static PyObject *
+int_is_integer_impl(PyObject *self);
+
+static PyObject *
+int_is_integer(PyObject *self, PyObject *Py_UNUSED(ignored))
+{
+ return int_is_integer_impl(self);
+}
+/*[clinic end generated code: output=e518fe2b5d519322 input=a9049054013a1b77]*/
return long_long(self);
}
+/*[clinic input]
+int.is_integer
+
+Returns True. Exists for duck type compatibility with float.is_integer.
+[clinic start generated code]*/
+
+static PyObject *
+int_is_integer_impl(PyObject *self)
+/*[clinic end generated code: output=90f8e794ce5430ef input=7e41c4d4416e05f2]*/
+{
+ Py_RETURN_TRUE;
+}
+
static PyMethodDef long_methods[] = {
{"conjugate", long_long_meth, METH_NOARGS,
"Returns self, the complex conjugate of any int."},
INT___GETNEWARGS___METHODDEF
INT___FORMAT___METHODDEF
INT___SIZEOF___METHODDEF
+ INT_IS_INTEGER_METHODDEF
{NULL, NULL} /* sentinel */
};