mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #25421: __sizeof__ methods of builtin types now use dynamic basic size.
This allows sys.getsize() to work correctly with their subclasses with __slots__ defined.
This commit is contained in:
parent
efd7b34d7c
commit
5c4064e8bd
19 changed files with 54 additions and 22 deletions
|
@ -1112,6 +1112,36 @@ class SizeofTest(unittest.TestCase):
|
|||
# weakcallableproxy
|
||||
check(weakref.proxy(int), size('2Pn2P'))
|
||||
|
||||
def check_slots(self, obj, base, extra):
|
||||
expected = sys.getsizeof(base) + struct.calcsize(extra)
|
||||
if gc.is_tracked(obj) and not gc.is_tracked(base):
|
||||
expected += struct.calcsize('2Pn') # PyGC_Head
|
||||
self.assertEqual(sys.getsizeof(obj), expected)
|
||||
|
||||
def test_slots(self):
|
||||
# check all subclassable types defined in Objects/ that allow
|
||||
# non-empty __slots__
|
||||
check = self.check_slots
|
||||
class BA(bytearray):
|
||||
__slots__ = 'a', 'b', 'c'
|
||||
check(BA(), bytearray(), '3P')
|
||||
class D(dict):
|
||||
__slots__ = 'a', 'b', 'c'
|
||||
check(D(x=[]), {'x': []}, '3P')
|
||||
class L(list):
|
||||
__slots__ = 'a', 'b', 'c'
|
||||
check(L(), [], '3P')
|
||||
class S(set):
|
||||
__slots__ = 'a', 'b', 'c'
|
||||
check(S(), set(), '3P')
|
||||
class FS(frozenset):
|
||||
__slots__ = 'a', 'b', 'c'
|
||||
check(FS(), frozenset(), '3P')
|
||||
from collections import OrderedDict
|
||||
class OD(OrderedDict):
|
||||
__slots__ = 'a', 'b', 'c'
|
||||
check(OD(x=[]), OrderedDict(x=[]), '3P')
|
||||
|
||||
def test_pythontypes(self):
|
||||
# check all types defined in Python/
|
||||
size = test.support.calcobjsize
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue