26
26
from plotly .utils import ElidedPrettyPrinter
27
27
from .validators import (DataValidator , LayoutValidator , FramesValidator )
28
28
29
+ from _plotly_future_ import _future_flags
30
+
29
31
# Create Undefined sentinel value
30
32
# - Setting a property to None removes any existing value
31
33
# - Setting a property to Undefined leaves existing value unmodified
@@ -49,6 +51,8 @@ class BaseFigure(object):
49
51
'plot_bgcolor' : 'plot-bgcolor'
50
52
}
51
53
54
+ _set_trace_uid = 'trace_uids' not in _future_flags
55
+
52
56
# Constructor
53
57
# -----------
54
58
def __init__ (self ,
@@ -145,7 +149,7 @@ class is a subclass of both BaseFigure and widgets.DOMWidget.
145
149
# ### Construct data validator ###
146
150
# This is the validator that handles importing sequences of trace
147
151
# objects
148
- self ._data_validator = DataValidator (set_uid = True )
152
+ self ._data_validator = DataValidator (set_uid = self . _set_trace_uid )
149
153
150
154
# ### Import traces ###
151
155
data = self ._data_validator .validate_coerce (data ,
@@ -513,9 +517,9 @@ def data(self, new_data):
513
517
514
518
# Validate new_data
515
519
# -----------------
516
- err_header = ('The data property of a figure may only be assigned '
520
+ err_header = ('The data property of a figure may only be assigned \n '
517
521
'a list or tuple that contains a permutation of a '
518
- 'subset of itself\n ' )
522
+ 'subset of itself. \n ' )
519
523
520
524
# ### Check valid input type ###
521
525
if not isinstance (new_data , (list , tuple )):
@@ -531,16 +535,14 @@ def data(self, new_data):
531
535
.format (typ = type (trace )))
532
536
raise ValueError (err_msg )
533
537
534
- # ### Check UIDs ###
535
- # Require that no new uids are introduced
536
- orig_uids = [_trace [ 'uid' ] for _trace in self ._data ]
537
- new_uids = [trace . uid for trace in new_data ]
538
+ # ### Check trace objects ###
539
+ # Require that no new traces are introduced
540
+ orig_uids = [id ( trace ) for trace in self .data ]
541
+ new_uids = [id ( trace ) for trace in new_data ]
538
542
539
543
invalid_uids = set (new_uids ).difference (set (orig_uids ))
540
544
if invalid_uids :
541
- err_msg = (
542
- err_header + ' Invalid trace(s) with uid(s): {invalid_uids}'
543
- .format (invalid_uids = invalid_uids ))
545
+ err_msg = err_header
544
546
545
547
raise ValueError (err_msg )
546
548
@@ -551,8 +553,7 @@ def data(self, new_data):
551
553
]
552
554
if duplicate_uids :
553
555
err_msg = (
554
- err_header + ' Received duplicated traces with uid(s): ' +
555
- '{duplicate_uids}' .format (duplicate_uids = duplicate_uids ))
556
+ err_header + ' Received duplicated traces' )
556
557
557
558
raise ValueError (err_msg )
558
559
@@ -562,8 +563,8 @@ def data(self, new_data):
562
563
delete_inds = []
563
564
564
565
# ### Unparent removed traces ###
565
- for i , _trace in enumerate (self ._data ):
566
- if _trace [ 'uid' ] in remove_uids :
566
+ for i , trace in enumerate (self .data ):
567
+ if id ( trace ) in remove_uids :
567
568
delete_inds .append (i )
568
569
569
570
# Unparent trace object to be removed
@@ -575,7 +576,7 @@ def data(self, new_data):
575
576
# ### Compute trace props / defaults after removal ###
576
577
traces_props_post_removal = [t for t in self ._data ]
577
578
traces_prop_defaults_post_removal = [t for t in self ._data_defaults ]
578
- uids_post_removal = [trace_data [ 'uid' ] for trace_data in self ._data ]
579
+ uids_post_removal = [id ( trace_data ) for trace_data in self .data ]
579
580
580
581
for i in reversed (delete_inds ):
581
582
del traces_props_post_removal [i ]
0 commit comments