自己自定义的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就是