Skip to content

Commit aa4c11b

Browse files
committed
Set trait values from static defaults at instance_init
Should fix the problem introduced in ipythongh-31 for the widgets. One small behavioural change: traitlets with no default value will raise TraitError when accessed instead of returning Undefined.
1 parent 1e89907 commit aa4c11b

File tree

2 files changed

+9
-6
lines changed

2 files changed

+9
-6
lines changed

traitlets/tests/test_traitlets.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ def test_get_undefined(self):
4949
class A(HasTraits):
5050
a = TraitType
5151
a = A()
52-
self.assertEqual(a.a, Undefined)
52+
with self.assertRaises(TraitError):
53+
a.a
5354

5455
def test_set(self):
5556
class A(HasTraitsStub):

traitlets/traitlets.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,9 @@ def instance_init(self, obj):
414414
# use provides a static default, transfer that to obj._trait_values.
415415
if (self._dynamic_default_callable(obj) is None) \
416416
and (self.default_value is not Undefined):
417-
self.validate_default_value(obj)
417+
v = self.validate_default_value(obj)
418+
if self.name is not None:
419+
obj._trait_values[self.name] = v
418420

419421
def __get__(self, obj, cls=None):
420422
"""Get the value of the trait by self.name for the instance.
@@ -432,10 +434,10 @@ def __get__(self, obj, cls=None):
432434
except KeyError:
433435
# Check for a dynamic initializer.
434436
dynamic_default = self._dynamic_default_callable(obj)
435-
if dynamic_default is not None:
436-
value = self._validate(obj, dynamic_default())
437-
else:
438-
value = self.validate_default_value(obj)
437+
if dynamic_default is None:
438+
raise TraitError("No default value found for %s trait of %r"
439+
% (self.name, obj))
440+
value = self._validate(obj, dynamic_default())
439441
obj._trait_values[self.name] = value
440442
return value
441443
except Exception:

0 commit comments

Comments
 (0)