11import inspect
22import warnings
33
4- from traitlets import TraitType , TraitError , Undefined
4+ from traitlets import TraitType , TraitError , Undefined , Sentinel
55
66class _DelayedImportError (object ):
77 def __init__ (self , package_name ):
@@ -21,6 +21,13 @@ def __getattribute__(self, name):
2121 pd = _DelayedImportError ('pandas' )
2222
2323
24+ Empty = Sentinel ('Empty' , 'traittypes' ,
25+ """
26+ Used in traittypes to specify that the default value should
27+ be an empty dataset
28+ """ )
29+
30+
2431class SciType (TraitType ):
2532
2633 """A base trait type for numpy arrays, pandas dataframes and series."""
@@ -108,16 +115,16 @@ def set(self, obj, value):
108115 if not np .array_equal (old_value , new_value ):
109116 obj ._notify_trait (self .name , old_value , new_value )
110117
111- def __init__ (self , default_value = Undefined , allow_none = False , dtype = None , ** kwargs ):
118+ def __init__ (self , default_value = Empty , allow_none = False , dtype = None , ** kwargs ):
112119 self .dtype = dtype
113- if default_value is Undefined :
120+ if default_value is Empty :
114121 default_value = np .array (0 , dtype = self .dtype )
115- elif default_value is not None :
122+ elif default_value is not None and default_value is not Undefined :
116123 default_value = np .asarray (default_value , dtype = self .dtype )
117124 super (Array , self ).__init__ (default_value = default_value , allow_none = allow_none , ** kwargs )
118125
119126 def make_dynamic_default (self ):
120- if self .default_value is None :
127+ if self .default_value is None or self . default_value is Undefined :
121128 return self .default_value
122129 else :
123130 return np .copy (self .default_value )
@@ -146,10 +153,12 @@ def set(self, obj, value):
146153 new_value = self ._validate (obj , value )
147154 old_value = obj ._trait_values .get (self .name , self .default_value )
148155 obj ._trait_values [self .name ] = new_value
149- if (old_value is None and new_value is not None ) or not old_value .equals (new_value ):
156+ if ((old_value is None and new_value is not None ) or
157+ (old_value is Undefined and new_value is not Undefined ) or
158+ not old_value .equals (new_value )):
150159 obj ._notify_trait (self .name , old_value , new_value )
151160
152- def __init__ (self , default_value = Undefined , allow_none = False , dtype = None , klass = None , ** kwargs ):
161+ def __init__ (self , default_value = Empty , allow_none = False , dtype = None , klass = None , ** kwargs ):
153162 if klass is None :
154163 klass = self .klass
155164 if (klass is not None ) and inspect .isclass (klass ):
@@ -158,14 +167,14 @@ def __init__(self, default_value=Undefined, allow_none=False, dtype=None, klass=
158167 raise TraitError ('The klass attribute must be a class'
159168 ' not: %r' % klass )
160169 self .dtype = dtype
161- if default_value is Undefined :
170+ if default_value is Empty :
162171 default_value = klass ()
163- elif default_value is not None :
172+ elif default_value is not None and default_value is not Undefined :
164173 default_value = klass (default_value )
165174 super (PandasType , self ).__init__ (default_value = default_value , allow_none = allow_none , ** kwargs )
166175
167176 def make_dynamic_default (self ):
168- if self .default_value is None :
177+ if self .default_value is None or self . default_value is Undefined :
169178 return self .default_value
170179 else :
171180 return self .default_value .copy ()
@@ -177,7 +186,7 @@ class DataFrame(PandasType):
177186
178187 info_text = 'a pandas dataframe'
179188
180- def __init__ (self , default_value = Undefined , allow_none = False , dtype = None , ** kwargs ):
189+ def __init__ (self , default_value = Empty , allow_none = False , dtype = None , ** kwargs ):
181190 if 'klass' not in kwargs and self .klass is None :
182191 import pandas as pd
183192 kwargs ['klass' ] = pd .DataFrame
@@ -191,7 +200,7 @@ class Series(PandasType):
191200
192201 info_text = 'a pandas series'
193202
194- def __init__ (self , default_value = Undefined , allow_none = False , dtype = None , ** kwargs ):
203+ def __init__ (self , default_value = Empty , allow_none = False , dtype = None , ** kwargs ):
195204 if 'klass' not in kwargs and self .klass is None :
196205 import pandas as pd
197206 kwargs ['klass' ] = pd .Series
0 commit comments