Skip to content

Commit 5665c8b

Browse files
committed
gh-144584: Remove support for non-int's in __int__/__index__()
1 parent 432ddd9 commit 5665c8b

File tree

8 files changed

+39
-86
lines changed

8 files changed

+39
-86
lines changed

Doc/deprecations/pending-removal-in-future.rst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ although there is currently no date scheduled for their removal.
2626
:keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`,
2727
:keyword:`in`, :keyword:`is` and :keyword:`or`. In a future release it
2828
will be changed to a syntax error. (:gh:`87999`)
29-
* Support for ``__index__()`` and ``__int__()`` method returning non-int type:
30-
these methods will be required to return an instance of a strict subclass of
31-
:class:`int`.
3229
* Support for ``__float__()`` method returning a strict subclass of
3330
:class:`float`: these methods will be required to return an instance of
3431
:class:`float`.

Doc/whatsnew/3.15.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1303,6 +1303,13 @@ zipimport
13031303
Use :meth:`zipimport.zipimporter.exec_module` instead.
13041304
(Contributed by Jiahao Li in :gh:`133656`.)
13051305

1306+
Others
1307+
------
1308+
1309+
* Remove support for returning non-:class:`int` objects in
1310+
:meth:`~object.__index__` and :meth:`~object.__int__`.
1311+
(Contributed by Sergey B Kirpichev in :gh:`144584`.)
1312+
13061313

13071314
Deprecated
13081315
==========

Lib/test/test_capi/test_float.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,7 @@ def __float__(self):
116116
self.assertRaises(TypeError, asdouble, BadIndex())
117117
self.assertRaises(TypeError, asdouble, BadFloat())
118118
self.assertRaises(RuntimeError, asdouble, BadFloat3())
119-
with self.assertWarns(DeprecationWarning):
120-
self.assertEqual(asdouble(BadIndex2()), 1.)
119+
self.assertRaises(TypeError, asdouble, BadIndex2())
121120
with self.assertWarns(DeprecationWarning):
122121
self.assertEqual(asdouble(BadFloat2()), 4.25)
123122
with warnings.catch_warnings():

Lib/test/test_capi/test_getargs.py

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ def test_b(self):
172172
self.assertEqual(99, getargs_b(Index()))
173173
self.assertEqual(0, getargs_b(IndexIntSubclass()))
174174
self.assertRaises(TypeError, getargs_b, BadIndex())
175-
with self.assertWarns(DeprecationWarning):
176-
self.assertEqual(1, getargs_b(BadIndex2()))
175+
self.assertRaises(TypeError, getargs_b, BadIndex2())
177176
self.assertEqual(0, getargs_b(BadIndex3()))
178177
self.assertRaises(TypeError, getargs_b, Int())
179178
self.assertEqual(0, getargs_b(IntSubclass()))
@@ -196,8 +195,7 @@ def test_B(self):
196195
self.assertEqual(99, getargs_B(Index()))
197196
self.assertEqual(0, getargs_B(IndexIntSubclass()))
198197
self.assertRaises(TypeError, getargs_B, BadIndex())
199-
with self.assertWarns(DeprecationWarning):
200-
self.assertEqual(1, getargs_B(BadIndex2()))
198+
self.assertRaises(TypeError, getargs_B, BadIndex2())
201199
self.assertEqual(0, getargs_B(BadIndex3()))
202200
self.assertRaises(TypeError, getargs_B, Int())
203201
self.assertEqual(0, getargs_B(IntSubclass()))
@@ -233,8 +231,7 @@ def test_H(self):
233231
self.assertEqual(99, getargs_H(Index()))
234232
self.assertEqual(0, getargs_H(IndexIntSubclass()))
235233
self.assertRaises(TypeError, getargs_H, BadIndex())
236-
with self.assertWarns(DeprecationWarning):
237-
self.assertEqual(1, getargs_H(BadIndex2()))
234+
self.assertRaises(TypeError, getargs_H, BadIndex2())
238235
self.assertEqual(0, getargs_H(BadIndex3()))
239236
self.assertRaises(TypeError, getargs_H, Int())
240237
self.assertEqual(0, getargs_H(IntSubclass()))
@@ -265,8 +262,7 @@ def test_I(self):
265262
self.assertEqual(99, getargs_I(Index()))
266263
self.assertEqual(0, getargs_I(IndexIntSubclass()))
267264
self.assertRaises(TypeError, getargs_I, BadIndex())
268-
with self.assertWarns(DeprecationWarning):
269-
self.assertEqual(1, getargs_I(BadIndex2()))
265+
self.assertRaises(TypeError, getargs_I, BadIndex2())
270266
self.assertEqual(0, getargs_I(BadIndex3()))
271267
self.assertRaises(TypeError, getargs_I, Int())
272268
self.assertEqual(0, getargs_I(IntSubclass()))
@@ -297,8 +293,7 @@ def test_k(self):
297293
self.assertEqual(99, getargs_k(Index()))
298294
self.assertEqual(0, getargs_k(IndexIntSubclass()))
299295
self.assertRaises(TypeError, getargs_k, BadIndex())
300-
with self.assertWarns(DeprecationWarning):
301-
self.assertEqual(1, getargs_k(BadIndex2()))
296+
self.assertRaises(TypeError, getargs_k, BadIndex2())
302297
self.assertEqual(0, getargs_k(BadIndex3()))
303298
self.assertRaises(TypeError, getargs_k, Int())
304299
self.assertEqual(0, getargs_k(IntSubclass()))
@@ -330,8 +325,7 @@ def test_h(self):
330325
self.assertEqual(99, getargs_h(Index()))
331326
self.assertEqual(0, getargs_h(IndexIntSubclass()))
332327
self.assertRaises(TypeError, getargs_h, BadIndex())
333-
with self.assertWarns(DeprecationWarning):
334-
self.assertEqual(1, getargs_h(BadIndex2()))
328+
self.assertRaises(TypeError, getargs_h, BadIndex2())
335329
self.assertEqual(0, getargs_h(BadIndex3()))
336330
self.assertRaises(TypeError, getargs_h, Int())
337331
self.assertEqual(0, getargs_h(IntSubclass()))
@@ -354,8 +348,7 @@ def test_i(self):
354348
self.assertEqual(99, getargs_i(Index()))
355349
self.assertEqual(0, getargs_i(IndexIntSubclass()))
356350
self.assertRaises(TypeError, getargs_i, BadIndex())
357-
with self.assertWarns(DeprecationWarning):
358-
self.assertEqual(1, getargs_i(BadIndex2()))
351+
self.assertRaises(TypeError, getargs_i, BadIndex2())
359352
self.assertEqual(0, getargs_i(BadIndex3()))
360353
self.assertRaises(TypeError, getargs_i, Int())
361354
self.assertEqual(0, getargs_i(IntSubclass()))
@@ -378,8 +371,7 @@ def test_l(self):
378371
self.assertEqual(99, getargs_l(Index()))
379372
self.assertEqual(0, getargs_l(IndexIntSubclass()))
380373
self.assertRaises(TypeError, getargs_l, BadIndex())
381-
with self.assertWarns(DeprecationWarning):
382-
self.assertEqual(1, getargs_l(BadIndex2()))
374+
self.assertRaises(TypeError, getargs_l, BadIndex2())
383375
self.assertEqual(0, getargs_l(BadIndex3()))
384376
self.assertRaises(TypeError, getargs_l, Int())
385377
self.assertEqual(0, getargs_l(IntSubclass()))
@@ -403,8 +395,7 @@ def test_n(self):
403395
self.assertEqual(99, getargs_n(Index()))
404396
self.assertEqual(0, getargs_n(IndexIntSubclass()))
405397
self.assertRaises(TypeError, getargs_n, BadIndex())
406-
with self.assertWarns(DeprecationWarning):
407-
self.assertEqual(1, getargs_n(BadIndex2()))
398+
self.assertRaises(TypeError, getargs_n, BadIndex2())
408399
self.assertEqual(0, getargs_n(BadIndex3()))
409400
self.assertRaises(TypeError, getargs_n, Int())
410401
self.assertEqual(0, getargs_n(IntSubclass()))
@@ -431,8 +422,7 @@ def test_L(self):
431422
self.assertEqual(99, getargs_L(Index()))
432423
self.assertEqual(0, getargs_L(IndexIntSubclass()))
433424
self.assertRaises(TypeError, getargs_L, BadIndex())
434-
with self.assertWarns(DeprecationWarning):
435-
self.assertEqual(1, getargs_L(BadIndex2()))
425+
self.assertRaises(TypeError, getargs_L, BadIndex2())
436426
self.assertEqual(0, getargs_L(BadIndex3()))
437427
self.assertRaises(TypeError, getargs_L, Int())
438428
self.assertEqual(0, getargs_L(IntSubclass()))
@@ -455,8 +445,7 @@ def test_K(self):
455445
self.assertEqual(99, getargs_K(Index()))
456446
self.assertEqual(0, getargs_K(IndexIntSubclass()))
457447
self.assertRaises(TypeError, getargs_K, BadIndex())
458-
with self.assertWarns(DeprecationWarning):
459-
self.assertEqual(1, getargs_K(BadIndex2()))
448+
self.assertRaises(TypeError, getargs_K, BadIndex2())
460449
self.assertEqual(0, getargs_K(BadIndex3()))
461450
self.assertRaises(TypeError, getargs_K, Int())
462451
self.assertEqual(0, getargs_K(IntSubclass()))

Lib/test/test_capi/test_number.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -263,11 +263,7 @@ def test_long(self):
263263
self.assertEqual(long(IntLike.with_val(99)), 99)
264264

265265
self.assertRaises(TypeError, long, IntLike.with_val(1.0))
266-
with warnings.catch_warnings():
267-
warnings.simplefilter("error", DeprecationWarning)
268-
self.assertRaises(DeprecationWarning, long, IntLike.with_val(True))
269-
with self.assertWarns(DeprecationWarning):
270-
self.assertEqual(long(IntLike.with_val(True)), 1)
266+
self.assertRaises(TypeError, long, IntLike.with_val(True))
271267
self.assertRaises(RuntimeError, long, IntLike.with_exc(RuntimeError))
272268

273269
self.assertRaises(TypeError, long, 1j)
@@ -307,11 +303,7 @@ def test_index(self):
307303

308304
self.assertEqual(index(11), 11)
309305

310-
with warnings.catch_warnings():
311-
warnings.simplefilter("error", DeprecationWarning)
312-
self.assertRaises(DeprecationWarning, index, IndexLike.with_val(True))
313-
with self.assertWarns(DeprecationWarning):
314-
self.assertEqual(index(IndexLike.with_val(True)), 1)
306+
self.assertRaises(TypeError, index, IndexLike.with_val(True))
315307
self.assertRaises(TypeError, index, IndexLike.with_val(1.0))
316308
self.assertRaises(RuntimeError, index, IndexLike.with_exc(RuntimeError))
317309

Lib/test/test_int.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -456,27 +456,21 @@ def __int__(self):
456456
return True
457457

458458
bad_int = BadIndex()
459-
with self.assertWarns(DeprecationWarning):
460-
n = int(bad_int)
461-
self.assertEqual(n, 1)
462-
self.assertIs(type(n), int)
459+
with self.assertRaises(TypeError):
460+
int(bad_int)
463461

464462
bad_int = BadIndex2()
465463
n = int(bad_int)
466464
self.assertEqual(n, 0)
467465
self.assertIs(type(n), int)
468466

469467
bad_int = BadInt()
470-
with self.assertWarns(DeprecationWarning):
471-
n = int(bad_int)
472-
self.assertEqual(n, 1)
473-
self.assertIs(type(n), int)
468+
with self.assertRaises(TypeError):
469+
int(bad_int)
474470

475471
bad_int = BadInt2()
476-
with self.assertWarns(DeprecationWarning):
477-
n = int(bad_int)
478-
self.assertEqual(n, 1)
479-
self.assertIs(type(n), int)
472+
with self.assertRaises(TypeError):
473+
int(bad_int)
480474

481475
def test_error_message(self):
482476
def check(s, base=None):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Remove support for returning non-:class:`int` objects in
2+
:meth:`~object.__index__` and :meth:`~object.__int__`.

Objects/abstract.c

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1428,24 +1428,11 @@ _PyNumber_Index(PyObject *item)
14281428
if (!result || PyLong_CheckExact(result)) {
14291429
return result;
14301430
}
1431-
1432-
if (!PyLong_Check(result)) {
1433-
PyErr_Format(PyExc_TypeError,
1434-
"%T.__index__() must return an int, not %T",
1435-
item, result);
1436-
Py_DECREF(result);
1437-
return NULL;
1438-
}
1439-
/* Issue #17576: warn if 'result' not of exact type int. */
1440-
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1441-
"%T.__index__() must return an int, not %T. "
1442-
"The ability to return an instance of a strict subclass of int "
1443-
"is deprecated, and may be removed in a future version of Python.",
1444-
item, result)) {
1445-
Py_DECREF(result);
1446-
return NULL;
1447-
}
1448-
return result;
1431+
PyErr_Format(PyExc_TypeError,
1432+
"%T.__index__() must return an int, not %T",
1433+
item, result);
1434+
Py_DECREF(result);
1435+
return NULL;
14491436
}
14501437

14511438
/* Return an exact Python int from the object item.
@@ -1538,25 +1525,11 @@ PyNumber_Long(PyObject *o)
15381525
if (!result || PyLong_CheckExact(result)) {
15391526
return result;
15401527
}
1541-
1542-
if (!PyLong_Check(result)) {
1543-
PyErr_Format(PyExc_TypeError,
1544-
"%T.__int__() must return an int, not %T",
1545-
o, result);
1546-
Py_DECREF(result);
1547-
return NULL;
1548-
}
1549-
/* Issue #17576: warn if 'result' not of exact type int. */
1550-
if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1551-
"%T.__int__() must return an int, not %T. "
1552-
"The ability to return an instance of a strict subclass of int "
1553-
"is deprecated, and may be removed in a future version of Python.",
1554-
o, result)) {
1555-
Py_DECREF(result);
1556-
return NULL;
1557-
}
1558-
Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1559-
return result;
1528+
PyErr_Format(PyExc_TypeError,
1529+
"%T.__int__() must return an int, not %T",
1530+
o, result);
1531+
Py_DECREF(result);
1532+
return NULL;
15601533
}
15611534
if (m && m->nb_index) {
15621535
return PyNumber_Index(o);

0 commit comments

Comments
 (0)