mirror of
https://github.com/python/cpython.git
synced 2025-12-10 02:50:09 +00:00
gh-101266: Fix __sizeof__ for subclasses of int (#101394)
Fix the behaviour of the `__sizeof__` method (and hence the results returned by `sys.getsizeof`) for subclasses of `int`. Previously, `int` subclasses gave identical results to the `int` base class, ignoring the presence of the instance dictionary. <!-- gh-issue-number: gh-101266 --> * Issue: gh-101266 <!-- /gh-issue-number -->
This commit is contained in:
parent
9b60ee976a
commit
39017e04b5
4 changed files with 48 additions and 9 deletions
|
|
@ -1601,5 +1601,44 @@ class LongTest(unittest.TestCase):
|
|||
self.assertEqual(n**2,
|
||||
(1 << (2 * bitlen)) - (1 << (bitlen + 1)) + 1)
|
||||
|
||||
def test___sizeof__(self):
|
||||
self.assertEqual(int.__itemsize__, sys.int_info.sizeof_digit)
|
||||
|
||||
# Pairs (test_value, number of allocated digits)
|
||||
test_values = [
|
||||
# We always allocate space for at least one digit, even for
|
||||
# a value of zero; sys.getsizeof should reflect that.
|
||||
(0, 1),
|
||||
(1, 1),
|
||||
(-1, 1),
|
||||
(BASE-1, 1),
|
||||
(1-BASE, 1),
|
||||
(BASE, 2),
|
||||
(-BASE, 2),
|
||||
(BASE*BASE - 1, 2),
|
||||
(BASE*BASE, 3),
|
||||
]
|
||||
|
||||
for value, ndigits in test_values:
|
||||
with self.subTest(value):
|
||||
self.assertEqual(
|
||||
value.__sizeof__(),
|
||||
int.__basicsize__ + int.__itemsize__ * ndigits
|
||||
)
|
||||
|
||||
# Same test for a subclass of int.
|
||||
class MyInt(int):
|
||||
pass
|
||||
|
||||
self.assertEqual(MyInt.__itemsize__, sys.int_info.sizeof_digit)
|
||||
|
||||
for value, ndigits in test_values:
|
||||
with self.subTest(value):
|
||||
self.assertEqual(
|
||||
MyInt(value).__sizeof__(),
|
||||
MyInt.__basicsize__ + MyInt.__itemsize__ * ndigits
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue