def test_join_dataclasses(self): C1 = make_dataclass('C1', 'a b') C2 = make_dataclass('C2', 'c d') C = join_dataclasses('C', [C1, C2]) CC = make_dataclass('CC', 'a b c d') cc = CC(1, 2, 3, 4) c = C(1, 2, 3, 4) self.assertNotEqual(c, cc)
def test_enable_gc(self): A = make_dataclass("A", ('x', 'y', 'z')) B = make_dataclass("B", ('x', 'y', 'z'), gc=True) a = A(1, 2, 3) b = B(1, 2, 3) self.assertEqual(a.x, b.x) self.assertEqual(a.y, b.y) self.assertEqual(a.z, b.z) self.assertEqual(sys.getsizeof(b) - sys.getsizeof(a), headgc_size)
def test_subclass2(self): A = make_dataclass("A", ('x', 'y')) class B(A): __fields__ = ('z', ) class C(B): pass self.assertEqual(type(A), type(B)) self.assertEqual(type(C), type(B)) self.assertEqual(C.__dictoffset__, 0) self.assertEqual(C.__weakrefoffset__, 0) c = C(1, 2, 3) self.assertEqual(gc.is_tracked(c), False) self.assertEqual(repr(c), "C(x=1, y=2, z=3)") self.assertEqual(c.x, 1) self.assertEqual(c.y, 2) self.assertEqual(c.z, 3) self.assertEqual(asdict(c), {'x': 1, 'y': 2, 'z': 3}) self.assertEqual(sys.getsizeof(c), pyobject_size + 3 * ref_size) with self.assertRaises(TypeError): weakref.ref(c) with self.assertRaises(AttributeError): c.__dict__ c = None
def test_datatype_copy1(self): A = make_dataclass("A", ('x', 'y'), varsize=True) a = A(1, 2, 3, 4, 5) self.assertEqual(gc.is_tracked(a), False) b = a.__copy__() self.assertEqual(gc.is_tracked(b), False) self.assertEqual(a, b)
def test_datatype_dict2(self): A = make_dataclass("A", ('x', 'y'), use_dict=True) a = A(1, 2, v=3, z=4) self.assertEqual(a.__dict__, {'v': 3, 'z': 4}) b = A(1, 2, z=3) self.assertEqual(b.__dict__, {'z': 3}) self.assertEqual(repr(b), "A(x=1, y=2, **{'z': 3})")
def test_datatype_subscript(self): A = make_dataclass("A", ('x', 'y'), mapping=True) a = A(1, 2) self.assertEqual(a['x'], 1) self.assertEqual(a['y'], 2) a['x'] = 100 self.assertEqual(a['x'], 100) a = None
def test_datatype_nosq_nomp(self): A = make_dataclass("A", ('x', 'y')) a = A(1, 2) self.assertEqual(gc.is_tracked(a), False) with self.assertRaises(TypeError): a[0] with self.assertRaises(TypeError): a['x']
def test_datatype_copy_dict(self): A = make_dataclass("A", ('x', 'y'), use_dict=True) a = A(1, 2, z=3, w=4) self.assertEqual(gc.is_tracked(a), False) b = a.__copy__() self.assertEqual(gc.is_tracked(b), False) self.assertEqual(a, b)
def test_refleak_on_assignemnt_dt(self): Test = make_dataclass("Test", "x", varsize=True) a = {} c = sys.getrefcount(a) b = Test(a) self.assertEqual(sys.getrefcount(a), c + 1) b.x = None self.assertEqual(sys.getrefcount(a), c)
def test_datatype_sq_nomp(self): A = make_dataclass("A", ('x', 'y'), sequence=True) a = A(1, 2) self.assertEqual(gc.is_tracked(a), False) self.assertEqual(a[0], 1) self.assertEqual(a[1], 2) with self.assertRaises(TypeError): a['x']
def test_datatype_nosq_mp(self): A = make_dataclass("A", ('x', 'y'), mapping=True) a = A(1, 2) self.assertEqual(gc.is_tracked(a), False) self.assertEqual(a['x'], 1) self.assertEqual(a['y'], 2) with self.assertRaises(TypeError): a[0]
def test_datatype_sq_mp(self): A = make_dataclass("A", ('x', 'y'), sequence=True, mapping=True) a = A(1, 2) self.assertEqual(gc.is_tracked(a), False) self.assertEqual(a['x'], 1) self.assertEqual(a['y'], 2) self.assertEqual(a[0], 1) self.assertEqual(a[1], 2)
def test_datatype_dict(self): A = make_dataclass("A", ('x', 'y'), use_dict=True, use_weakref=True) a = A(1, 2) self.assertEqual(gc.is_tracked(a), False) self.assertEqual(repr(a), "A(x=1, y=2)") self.assertEqual(a.x, 1) self.assertEqual(a.y, 2) self.assertEqual(asdict(a), {'x': 1, 'y': 2}) weakref.ref(a) self.assertEqual(a.__dict__, {}) a.z = 3 self.assertEqual(a.z, a.__dict__['z']) a = None
def test_datatype(self): A = make_dataclass("A", ('x', 'y')) a = A(1, 2) self.assertEqual(repr(a), "A(x=1, y=2)") self.assertEqual(a.x, 1) self.assertEqual(a.y, 2) self.assertEqual(asdict(a), {'x': 1, 'y': 2}) # self.assertEqual(sys.getsizeof(a), 32) with self.assertRaises(TypeError): weakref.ref(a) with self.assertRaises(AttributeError): a.__dict__ with self.assertRaises(AttributeError): a.z = 3 with self.assertRaises(AttributeError): a.z a = None
def test_keyword_args_defaults(self): A = make_dataclass("A", ('x', 'y', 'z'), defaults=(100, 200, 300)) a1 = A(x=1) self.assertEqual(repr(a1), "A(x=1, y=200, z=300)") self.assertEqual(a1.x, 1) self.assertEqual(a1.y, 200) self.assertEqual(a1.z, 300) a2 = A(x=1, y=2) self.assertEqual(repr(a2), "A(x=1, y=2, z=300)") self.assertEqual(a2.x, 1) self.assertEqual(a2.y, 2) self.assertEqual(a2.z, 300) a3 = A(x=1, y=2, z=3) self.assertEqual(repr(a3), "A(x=1, y=2, z=3)") self.assertEqual(a3.x, 1) self.assertEqual(a3.y, 2) self.assertEqual(a3.z, 3)
def test_keyword_args(self): A = make_dataclass("A", ('x', 'y', 'z'), defaults=3 * (None, )) a1 = A(x=1) self.assertEqual(repr(a1), "A(x=1, y=None, z=None)") self.assertEqual(a1.x, 1) self.assertEqual(a1.y, None) self.assertEqual(a1.z, None) a2 = A(x=1, y=2) self.assertEqual(repr(a2), "A(x=1, y=2, z=None)") self.assertEqual(a2.x, 1) self.assertEqual(a2.y, 2) self.assertEqual(a2.z, None) a3 = A(x=1, y=2, z=3) self.assertEqual(repr(a3), "A(x=1, y=2, z=3)") self.assertEqual(a3.x, 1) self.assertEqual(a3.y, 2) self.assertEqual(a3.z, 3)
def test_subclass(self): A = make_dataclass("A", ('x', 'y')) class B(A): pass self.assertEqual(type(A), type(B)) self.assertEqual(B.__dictoffset__, 0) self.assertEqual(B.__weakrefoffset__, 0) b = B(1, 2) self.assertEqual(gc.is_tracked(b), False) self.assertEqual(repr(b), "B(x=1, y=2)") self.assertEqual(b.x, 1) self.assertEqual(b.y, 2) self.assertEqual(asdict(b), {'x': 1, 'y': 2}) self.assertEqual(sys.getsizeof(b), pyobject_size + 2 * ref_size) self.assertEqual(A.__basicsize__, B.__basicsize__) with self.assertRaises(TypeError): weakref.ref(b) with self.assertRaises(AttributeError): b.__dict__
def test_defaults(self): A = make_dataclass("A", ('x', 'y', 'z'), defaults=(100, 200, 300)) a1 = A() self.assertEqual(repr(a1), "A(x=100, y=200, z=300)") self.assertEqual(a1.x, 100) self.assertEqual(a1.y, 200) self.assertEqual(a1.z, 300) self.assertEqual(asdict(a1), {'x': 100, 'y': 200, 'z': 300}) a2 = A(1, z=400) self.assertEqual(repr(a2), "A(x=1, y=200, z=400)") self.assertEqual(a2.x, 1) self.assertEqual(a2.y, 200) self.assertEqual(a2.z, 400) self.assertEqual(asdict(a2), {'x': 1, 'y': 200, 'z': 400}) a3 = A(1, 2, z=400) self.assertEqual(repr(a3), "A(x=1, y=2, z=400)") self.assertEqual(a3.x, 1) self.assertEqual(a3.y, 2) self.assertEqual(a3.z, 400) self.assertEqual(asdict(a3), {'x': 1, 'y': 2, 'z': 400})
import unittest import pickle, copy import keyword import re import sys import gc import weakref from recordclass import make_dataclass, make_arrayclass, datatype, asdict from recordclass.utils import headgc_size, ref_size, pyobject_size, pyvarobject_size, pyssize from recordclass import DataclassStorage TPickleV5 = make_dataclass("TPickleV5", ('x', 'y', 'z'), varsize=True) TPickleV6 = make_dataclass("TPickleV6", ('x', 'y', 'z'), varsize=True, use_dict=True) TPickleV7 = make_dataclass("TPickleV7", ('x', 'y', 'z'), varsize=True) TPickleV8 = make_dataclass("TPickleV8", ('x', 'y', 'z'), varsize=True, use_dict=True) class datatupleTest(unittest.TestCase): def test_datatype_copy1(self): A = make_dataclass("A", ('x', 'y'), varsize=True) a = A(1, 2, 3, 4, 5) self.assertEqual(gc.is_tracked(a), False) b = a.__copy__() self.assertEqual(gc.is_tracked(b), False) self.assertEqual(a, b)
def test_datatype_copy(self): A = make_dataclass("A", ('x', 'y')) a = A(1, 2) b = a.__copy__() self.assertEqual(a, b)
def test_missing_args2(self): A = make_dataclass("A", ('x', 'y', 'z')) a = A(1) self.assertEqual(a[0], 1) self.assertEqual(a[1], None) self.assertEqual(a[2], None)
def test_tuple2(self): A = make_dataclass("A", ('x', 'y', 'z'), iterable=True) a = A(1, 2.0, "a") self.assertEqual(tuple(a), (1, 2.0, "a"))
def test_missing_args2(self): A = make_dataclass("A", ('a', 'b', 'c'), argsonly=True) a = A(1) self.assertEqual(a.a, 1) self.assertEqual(a.b, None) self.assertEqual(a.c, None)
def test_hash(self): A = make_dataclass("A", ("a", "b", "c"), hashable=True) a = A(1, 2.0, "a") hash(a)
def test_dataobject_local_dict(self): A = make_dataclass("A", ('x', 'y'), use_dict=True) a = A(1, 2) a.a = 1 self.assertEqual(a.a, 1) self.assertEqual(a.__dict__, {'a': 1})
def test_reduce(self): A = make_dataclass("A", ("x", "y", "z")) a = A(1, 2, 3) o, t = a.__reduce__() self.assertEqual(o, A) self.assertEqual(t, (1, 2, 3))
def test_iter2(self): A = make_dataclass("A", ('x', 'y', 'z'), iterable=True) a = A(1, 2.0, "a") self.assertEqual(list(iter(a)), [1, 2.0, "a"])
def test_fields_dict(self): A = make_dataclass("A", {'x': int, 'y': int}) a = A(x=1, y=2) self.assertEqual(a.x, 1) self.assertEqual(a.y, 2)
def __init__(self, x, y, z): self.x = x self.y = y self.z = z ex_dict = {'x': 1, 'y': 2, 'z': 3} print('dict: {} byte'.format(sys.getsizeof(ex_dict))) ex = Shape(1, 2, 3) print('ex : {} byte'.format(sys.getsizeof(ex) + sys.getsizeof(ex.__dict__))) ex_slot = ShapeSlot(1, 2, 3) print('ex_slot: {} byte'.format(sys.getsizeof(ex_slot))) from collections import namedtuple ShapeNamedTuple = namedtuple('ShapeNamedTuple', ['x', 'y', 'z']) ex_namedtuple = ShapeNamedTuple(1, 2, 3) print('ex_namedtuple: {} byte'.format(sys.getsizeof(ex_namedtuple))) from recordclass import recordclass ShapeRecord = recordclass('ShapeRecord', ('x', 'y', 'z')) ex_record = ShapeRecord(1, 2, 3) print('ex_record: {} byte'.format(sys.getsizeof(ex_record))) from recordclass import make_dataclass ShapeMake = make_dataclass('ShapeMake', ('x', 'y', 'z')) ex_make = ShapeMake(1, 2, 3) print('ex_make: {} byte'.format(sys.getsizeof(ex_make)))
def test_join_dataclasses_intersection(self): C1 = make_dataclass('C1', 'a b') C2 = make_dataclass('C2', 'b c') with self.assertRaises(AttributeError): C = join_dataclasses('C', [C1, C2])