ndicts are now deepcopyable.

This commit is contained in:
Thomas Wiecki
2012-07-06 11:54:40 -04:00
parent f6c65983bb
commit 5fcb2de59b
2 changed files with 31 additions and 4 deletions
+28 -4
View File
@@ -1,6 +1,8 @@
from datetime import datetime
import pytz
from copy import deepcopy
from zipline.utils.protocol_utils import ndict
def test_ndict():
@@ -54,10 +56,32 @@ def test_ndict():
del nd['x']
assert not nd.has_key('x')
assert nd.get('x') is None
for n in xrange(1000):
dt = datetime.utcnow().replace(tzinfo=pytz.utc)
nd2 = ndict({"dt":dt, "otherdata":"ishere"*1000, "maybeanint":3})
nd2.dt2 = dt
nd2.dt2 = dt
def test_ndict_deepcopy():
def assert_correctly_copied(orig, copy):
assert nd == nd_dc, "Deepcopied ndict should have same keys and values."
nd_dc.z = 3
assert 'z' not in nd, "'z' also added to original ndict."
nd_dc.y = 10
assert nd_dc.y == 10, "value of copied ndict not correctly set."
assert nd.y != 10, "value also set of original ndict."
nd = ndict({'x': 1, 'y': 2})
nd_dc = deepcopy(nd)
assert_correctly_copied(nd, nd_dc)
nd = ndict({'x':[1,2,3], 'y': {1: 1}})
nd_dc = deepcopy(nd)
assert_correctly_copied(nd, nd_dc)
nd_dc.x.append(4)
assert nd_dc.x[-1] == 4, "not correctly appended to copied."
assert nd.x[-1] != 4, "also copied to original."
+3
View File
@@ -55,6 +55,9 @@ class ndict(MutableMapping):
# Abstact Overloads
# -----------------
def __deepcopy__(self, memo):
return ndict(copy.deepcopy(self.__internal))
def __setattr__(self, key, value):
if key == 'cls' or key == '__internal' or '_ndict' in key:
super(ndict, self).__setattr__(key, value)