自定义python自建类型(四)一致性测试

本文介绍了一个自定义SparseDict的一致性测试过程,包括初始化、删除、获取、弹出等操作的验证,并通过引用计数来确保内存管理正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  自己自定义的dict写完之后,还需要针对其进行一致性测,主要就是针对各种情况的引用计数进行对比,具体代码如下

# -*- coding: utf-8 -*-
from sparsedict import sparsedict
import copy
import sys

def EQ(a, b):
    if a != b:
        raise NameError("test process has a error in here %s, %s" % (a, b) )
    return

def EQList(a, b):
    a = copy.deepcopy(a)
    a.sort()
    b = copy.deepcopy(b)
    b.sort()
    if a != b:
        raise NameError("test process has a error in here")


#²âÊÔ¹¹Ôì¸úÏú»Ù
origindict = {10001: 10002, (10003, 10004): 10005, 'abc': 'abcd', ('a', 10006): {10007:10008}}
originkeys = origindict.keys()
originvalues = origindict.values()
dict_count = sys.getrefcount(origindict)
key_counts = [sys.getrefcount(k) for k in originkeys]
value_counts = [sys.getrefcount(k) for k in originvalues]
testdict = sparsedict(origindict)
EQList(origindict.keys(), testdict.keys())
EQList(origindict.values(), testdict.values())
EQList(origindict.items(), testdict.items())
EQ(dict_count, sys.getrefcount(origindict))
test_key_counts = [sys.getrefcount(k) - 1 for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) - 1 for k in originvalues]
EQ(value_counts, test_value_counts)
testdict = None
test_key_counts = [sys.getrefcount(k) for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) for k in originvalues]
EQ(value_counts, test_value_counts)

testdict = sparsedict()
for k, v in origindict.iteritems():
    testdict[k] = v
k = None
v = None
EQList(origindict.keys(), testdict.keys())
EQList(origindict.values(), testdict.values())
EQList(origindict.items(), testdict.items())
EQ(dict_count, sys.getrefcount(origindict))
test_key_counts = [sys.getrefcount(k) - 1 for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) - 1 for k in originvalues]
EQ(value_counts, test_value_counts)
testdict = None
test_key_counts = [sys.getrefcount(k) for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) for k in originvalues]
EQ(value_counts, test_value_counts)


print 'test init and delete sparsedict succeedly'

#²âÊÔget,pop,delete
testdict = sparsedict(origindict)
testoriginidct = copy.deepcopy(origindict)
for k, v in origindict.iteritems():
    EQ(testdict[k], testoriginidct[k])

EQ(testdict.get('abcd', None), testoriginidct.get('abcd', None))
EQ(testdict.get('abcd'), testoriginidct.get('abcd'))

for k, v in origindict.iteritems():
    EQ(testdict.pop(k), testoriginidct.pop(k))

EQ(testdict.pop('abcd', None), testoriginidct.pop('abcd', None))
k, v = None, None
test_key_counts = [sys.getrefcount(k) for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) for k in originvalues]
EQ(value_counts, test_value_counts)

testdict = sparsedict(origindict)
testoriginidct = copy.deepcopy(origindict)
for k, v in origindict.iteritems():
    del testdict[k]
    del testoriginidct[k]

EQ(testdict.get('abc', None), testoriginidct.get('abc', None))
k, v = None, None
test_key_counts = [sys.getrefcount(k) for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) for k in originvalues]
EQ(value_counts, test_value_counts)

print 'test get,pop,delete sparsedict succeedly'

#²âÊÔ __contains__, __getitem__, __sizeof__, has_key, setdefault, clear, copy
testdict = sparsedict(origindict)
testoriginidct = copy.deepcopy(origindict)
for k, v in origindict.iteritems():
    EQ(testdict.__contains__(k), testoriginidct.__contains__(k))
EQ(testdict.__contains__('abcd'), testoriginidct.__contains__('abcd'))

for k, v in origindict.iteritems():
    EQ(testdict.__getitem__(k), testoriginidct.__getitem__(k))

print 'sizeof testdict', testdict.__sizeof__()

for k, v in origindict.iteritems():
    EQ(testdict.has_key(k), testoriginidct.has_key(k))
EQ(testdict.has_key('abcd'), testoriginidct.has_key('abcd'))

for k, v in origindict.iteritems():
    EQ(k in testdict, k in testoriginidct)

EQ('abcd' in testdict, 'abcd' in testoriginidct)

k = 'abcd'
countabcd = sys.getrefcount(k)
EQ(testdict.setdefault('abcd', 'abcdeff'), testoriginidct.setdefault('abcd', 'abcdeff'))
EQ(testdict['abcd'], testoriginidct['abcd'])
EQ(countabcd + 2, sys.getrefcount(k))

EQ(testdict.copy(), testoriginidct)
testdict.clear()
testoriginidct.clear()
EQ(testdict.copy(), testoriginidct)

testdict = None
testoriginidct = None
k, v = None, None
test_key_counts = [sys.getrefcount(k) for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) for k in originvalues]
EQ(value_counts, test_value_counts)

print 'test __contains__, __getitem__, __sizeof__, has_key, setdefault, clear, copy succeedly'

#²âÊÔiterkeys, itervalues, iteritems
testdict = sparsedict(origindict)
testoriginidct = copy.deepcopy(origindict)
EQList(list(testdict.iterkeys()), list(testoriginidct.iterkeys()))
EQList(list(testdict.itervalues()), list(testoriginidct.itervalues()))
EQList(list(testdict.iteritems()), list(testoriginidct.iteritems()))

testdict = sparsedict()
testoriginidct = {}
EQList(list(testdict.iterkeys()), list(testoriginidct.iterkeys()))
EQList(list(testdict.itervalues()), list(testoriginidct.itervalues()))
EQList(list(testdict.iteritems()), list(testoriginidct.iteritems()))

testdict = None
testoriginidct = None
k, v = None, None
test_key_counts = [sys.getrefcount(k) for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) for k in originvalues]
EQ(value_counts, test_value_counts)
print 'test iterkeys, itervalues, iteritems succeedly'
#²âÊÔprint, repr
testdict = sparsedict(origindict)

print testdict
EQ('%s' % (testdict), str(testdict))

testdict = None
test_key_counts = [sys.getrefcount(k) for k in originkeys]
EQ(key_counts, test_key_counts)
test_value_counts = [sys.getrefcount(k) for k in originvalues]
EQ(value_counts, test_value_counts)

print 'test print, repr succeedly'

详细的模块代码在
https://github.com/WeiKun/dictdesign
其中的SparseDict就是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值