diff --git a/traitlets/tests/test_traitlets.py b/traitlets/tests/test_traitlets.py index 1e2029ae..acb8a634 100644 --- a/traitlets/tests/test_traitlets.py +++ b/traitlets/tests/test_traitlets.py @@ -2598,7 +2598,7 @@ class C(HasTraits): a = Unicode('hard default') def _a_default(self): return 'default method' - + C._a_default = lambda self: 'overridden' c = C() assert c.a == 'overridden' @@ -2609,7 +2609,7 @@ class C(HasTraits): @default('a') def _a_default(self): return 'default method' - + C._a_default = lambda self: 'overridden' c = C() assert c.a == 'overridden' @@ -2620,8 +2620,21 @@ class C(HasTraits): @default('a') def _a_default(self): return 'default method' - + c = C() c._a_default = lambda self: 'overridden' assert c.a == 'overridden' +def test_copy_HasTraits(): + from copy import copy + + class C(HasTraits): + a = Int() + + c = C(a=1) + assert c.a == 1 + + cc = copy(c) + cc.a = 2 + assert cc.a == 2 + assert c.a == 1 diff --git a/traitlets/traitlets.py b/traitlets/traitlets.py index 4ad3e952..be2a8f95 100644 --- a/traitlets/traitlets.py +++ b/traitlets/traitlets.py @@ -1088,6 +1088,9 @@ def __getstate__(self): # recall of instance_init during __setstate__ d['_trait_notifiers'] = {} d['_trait_validators'] = {} + d['_trait_values'] = self._trait_values.copy() + d['_cross_validation_lock'] = False # FIXME: raise if cloning locked! + return d def __setstate__(self, state): diff --git a/traitlets/utils/sentinel.py b/traitlets/utils/sentinel.py index dc57a259..0760bec8 100644 --- a/traitlets/utils/sentinel.py +++ b/traitlets/utils/sentinel.py @@ -3,6 +3,7 @@ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. + class Sentinel(object): def __init__(self, name, module, docstring=None): @@ -11,7 +12,11 @@ def __init__(self, name, module, docstring=None): if docstring: self.__doc__ = docstring - def __repr__(self): - return str(self.module)+'.'+self.name + return str(self.module) + '.' + self.name + + def __copy__(self): + return self + def __deepcopy__(self, memo): + return self