mirror of https://github.com/python/cpython
gh-100268: Add is_integer method to int (#100439)
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.
This commit is contained in:
parent
a23cb72ac8
commit
3e46f9fe05
|
@ -609,6 +609,12 @@ class`. In addition, it provides a few more methods:
|
|||
|
||||
.. 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
|
||||
---------------------------
|
||||
|
||||
|
|
|
@ -1553,6 +1553,11 @@ class LongTest(unittest.TestCase):
|
|||
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
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Add :meth:`int.is_integer` to improve duck type compatibility between :class:`int` and :class:`float`.
|
|
@ -467,4 +467,22 @@ skip_optional_kwonly:
|
|||
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]*/
|
||||
|
|
|
@ -6168,6 +6168,19 @@ long_long_meth(PyObject *self, PyObject *Py_UNUSED(ignored))
|
|||
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."},
|
||||
|
@ -6186,6 +6199,7 @@ static PyMethodDef long_methods[] = {
|
|||
INT___GETNEWARGS___METHODDEF
|
||||
INT___FORMAT___METHODDEF
|
||||
INT___SIZEOF___METHODDEF
|
||||
INT_IS_INTEGER_METHODDEF
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue