Skip to content

Commit

Permalink
pythongh-100268: Add is_integer method to int (python#100439)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
hauntsaninja authored Dec 24, 2022
1 parent a23cb72 commit 3e46f9f
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 1 deletion.
6 changes: 6 additions & 0 deletions Doc/library/stdtypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
---------------------------

Expand Down
5 changes: 5 additions & 0 deletions Lib/test/test_long.py
Original file line number Diff line number Diff line change
Expand Up @@ -1553,6 +1553,11 @@ def test_from_bytes_small(self):
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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add :meth:`int.is_integer` to improve duck type compatibility between :class:`int` and :class:`float`.
20 changes: 19 additions & 1 deletion Objects/clinic/longobject.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions Objects/longobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -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."},
Expand All @@ -6186,6 +6199,7 @@ static PyMethodDef long_methods[] = {
INT___GETNEWARGS___METHODDEF
INT___FORMAT___METHODDEF
INT___SIZEOF___METHODDEF
INT_IS_INTEGER_METHODDEF
{NULL, NULL} /* sentinel */
};

Expand Down

0 comments on commit 3e46f9f

Please sign in to comment.