Skip to content

Commit b775646

Browse files
authored
Merge pull request ipython#482 from ankostis/fix_copy
Fix copy(HasTraits) by copying `_trait_values` dict
2 parents f6f27bb + d454aa9 commit b775646

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

Diff for: traitlets/tests/test_traitlets.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -2598,7 +2598,7 @@ class C(HasTraits):
25982598
a = Unicode('hard default')
25992599
def _a_default(self):
26002600
return 'default method'
2601-
2601+
26022602
C._a_default = lambda self: 'overridden'
26032603
c = C()
26042604
assert c.a == 'overridden'
@@ -2609,7 +2609,7 @@ class C(HasTraits):
26092609
@default('a')
26102610
def _a_default(self):
26112611
return 'default method'
2612-
2612+
26132613
C._a_default = lambda self: 'overridden'
26142614
c = C()
26152615
assert c.a == 'overridden'
@@ -2620,8 +2620,21 @@ class C(HasTraits):
26202620
@default('a')
26212621
def _a_default(self):
26222622
return 'default method'
2623-
2623+
26242624
c = C()
26252625
c._a_default = lambda self: 'overridden'
26262626
assert c.a == 'overridden'
26272627

2628+
def test_copy_HasTraits():
2629+
from copy import copy
2630+
2631+
class C(HasTraits):
2632+
a = Int()
2633+
2634+
c = C(a=1)
2635+
assert c.a == 1
2636+
2637+
cc = copy(c)
2638+
cc.a = 2
2639+
assert cc.a == 2
2640+
assert c.a == 1

Diff for: traitlets/traitlets.py

+3
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,9 @@ def __getstate__(self):
10881088
# recall of instance_init during __setstate__
10891089
d['_trait_notifiers'] = {}
10901090
d['_trait_validators'] = {}
1091+
d['_trait_values'] = self._trait_values.copy()
1092+
d['_cross_validation_lock'] = False # FIXME: raise if cloning locked!
1093+
10911094
return d
10921095

10931096
def __setstate__(self, state):

Diff for: traitlets/utils/sentinel.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# Copyright (c) IPython Development Team.
44
# Distributed under the terms of the Modified BSD License.
55

6+
67
class Sentinel(object):
78

89
def __init__(self, name, module, docstring=None):
@@ -11,7 +12,11 @@ def __init__(self, name, module, docstring=None):
1112
if docstring:
1213
self.__doc__ = docstring
1314

14-
1515
def __repr__(self):
16-
return str(self.module)+'.'+self.name
16+
return str(self.module) + '.' + self.name
17+
18+
def __copy__(self):
19+
return self
1720

21+
def __deepcopy__(self, memo):
22+
return self

0 commit comments

Comments
 (0)