1
1
import inspect
2
2
import warnings
3
3
4
- from traitlets import TraitType , TraitError , Undefined
4
+ from traitlets import TraitType , TraitError , Undefined , Sentinel
5
5
6
6
class _DelayedImportError (object ):
7
7
def __init__ (self , package_name ):
@@ -21,6 +21,13 @@ def __getattribute__(self, name):
21
21
pd = _DelayedImportError ('pandas' )
22
22
23
23
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
+
24
31
class SciType (TraitType ):
25
32
26
33
"""A base trait type for numpy arrays, pandas dataframes and series."""
@@ -108,16 +115,16 @@ def set(self, obj, value):
108
115
if not np .array_equal (old_value , new_value ):
109
116
obj ._notify_trait (self .name , old_value , new_value )
110
117
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 ):
112
119
self .dtype = dtype
113
- if default_value is Undefined :
120
+ if default_value is Empty :
114
121
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 :
116
123
default_value = np .asarray (default_value , dtype = self .dtype )
117
124
super (Array , self ).__init__ (default_value = default_value , allow_none = allow_none , ** kwargs )
118
125
119
126
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 :
121
128
return self .default_value
122
129
else :
123
130
return np .copy (self .default_value )
@@ -146,10 +153,12 @@ def set(self, obj, value):
146
153
new_value = self ._validate (obj , value )
147
154
old_value = obj ._trait_values .get (self .name , self .default_value )
148
155
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 )):
150
159
obj ._notify_trait (self .name , old_value , new_value )
151
160
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 ):
153
162
if klass is None :
154
163
klass = self .klass
155
164
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=
158
167
raise TraitError ('The klass attribute must be a class'
159
168
' not: %r' % klass )
160
169
self .dtype = dtype
161
- if default_value is Undefined :
170
+ if default_value is Empty :
162
171
default_value = klass ()
163
- elif default_value is not None :
172
+ elif default_value is not None and default_value is not Undefined :
164
173
default_value = klass (default_value )
165
174
super (PandasType , self ).__init__ (default_value = default_value , allow_none = allow_none , ** kwargs )
166
175
167
176
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 :
169
178
return self .default_value
170
179
else :
171
180
return self .default_value .copy ()
@@ -177,7 +186,7 @@ class DataFrame(PandasType):
177
186
178
187
info_text = 'a pandas dataframe'
179
188
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 ):
181
190
if 'klass' not in kwargs and self .klass is None :
182
191
import pandas as pd
183
192
kwargs ['klass' ] = pd .DataFrame
@@ -191,7 +200,7 @@ class Series(PandasType):
191
200
192
201
info_text = 'a pandas series'
193
202
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 ):
195
204
if 'klass' not in kwargs and self .klass is None :
196
205
import pandas as pd
197
206
kwargs ['klass' ] = pd .Series
0 commit comments