Skip to content

Commit 6f6672e

Browse files
author
Jon M. Mease
committed
Cleanup / review of serializers.py: Removed traitlets dependency from basedatatypes.py
1 parent 58629de commit 6f6672e

File tree

2 files changed

+80
-14
lines changed

2 files changed

+80
-14
lines changed

plotly/basedatatypes.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from typing import Dict, Tuple, Union, Callable, List
77

88
import numpy as np
9-
from traitlets import Undefined
109

1110
import plotly.offline as pyo
1211
from _plotly_utils.basevalidators import (
@@ -18,6 +17,12 @@
1817
from plotly.validators import (DataValidator, LayoutValidator, FramesValidator)
1918

2019

20+
# Create Undefined sentinel value
21+
# - Setting a property to None removes any existing value
22+
# - Setting a property to Undefined leaves existing value unmodified
23+
Undefined = object()
24+
25+
2126
class BaseFigure:
2227
"""
2328
Base class for all figure types (both widget and non-widget)

plotly/serializers.py

+74-13
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,101 @@
1-
2-
# Create sentinal Undefined object
3-
from traitlets import Undefined
41
import numpy as np
52

3+
from plotly.basedatatypes import Undefined
4+
5+
66
def _py_to_js(v, widget_manager):
7-
# print('_py_to_js')
8-
# print(v)
7+
"""
8+
Python -> Javascript ipywidget serializer
9+
10+
This function must repalce all objects that the ipywidget library
11+
can't serialize natively (e.g. numpy arrays) with serializable
12+
representations
13+
14+
Parameters
15+
----------
16+
v
17+
Object to be serialized
18+
widget_manager
19+
ipywidget widget_manager (unused)
20+
21+
Returns
22+
-------
23+
any
24+
Value that the ipywidget library can serialize natively
25+
"""
26+
27+
# Handle dict recursively
28+
# -----------------------
929
if isinstance(v, dict):
1030
return {k: _py_to_js(v, widget_manager) for k, v in v.items()}
31+
32+
# Handle list/tuple recursively
33+
# -----------------------------
1134
elif isinstance(v, (list, tuple)):
1235
return [_py_to_js(v, widget_manager) for v in v]
36+
37+
# Handle numpy array
38+
# ------------------
1339
elif isinstance(v, np.ndarray):
14-
if v.ndim == 1 and v.dtype.kind in ['u', 'i', 'f']: # (un)signed integer or float
15-
return {'buffer': memoryview(v), 'dtype': str(v.dtype), 'shape': v.shape}
40+
# Convert 1D numpy arrays with numeric types to memoryviews with
41+
# datatype and shape metadata.
42+
if v.ndim == 1 and v.dtype.kind in ['u', 'i', 'f']:
43+
return {'buffer': memoryview(v),
44+
'dtype': str(v.dtype),
45+
'shape': v.shape}
1646
else:
47+
# Convert all other numpy to lists
1748
return v.tolist()
49+
50+
# Handle Undefined
51+
# ----------------
52+
if v is Undefined:
53+
return '_undefined_'
54+
55+
# Handle simple value
56+
# -------------------
1857
else:
19-
if v is Undefined:
20-
return '_undefined_'
21-
else:
22-
return v
58+
return v
2359

2460

2561
def _js_to_py(v, widget_manager):
26-
# print('_js_to_py')
27-
# print(v)
62+
"""
63+
Javascript -> Python ipywidget deserializer
64+
65+
Parameters
66+
----------
67+
v
68+
Object to be deserialized
69+
widget_manager
70+
ipywidget widget_manager (unused)
71+
72+
Returns
73+
-------
74+
any
75+
Deserialized object for use by the Python side of the library
76+
"""
77+
# Handle dict
78+
# -----------
2879
if isinstance(v, dict):
2980
return {k: _js_to_py(v, widget_manager) for k, v in v.items()}
81+
82+
# Handle list/tuple
83+
# -----------------
3084
elif isinstance(v, (list, tuple)):
3185
return [_js_to_py(v, widget_manager) for v in v]
86+
87+
# Handle Undefined
88+
# ----------------
3289
elif isinstance(v, str) and v == '_undefined_':
3390
return Undefined
91+
92+
# Handle simple value
93+
# -------------------
3494
else:
3595
return v
3696

3797

98+
# Custom serializer dict for use in ipywidget traitlet definitions
3899
custom_serializers = {
39100
'from_json': _js_to_py,
40101
'to_json': _py_to_js

0 commit comments

Comments
 (0)