Arcadia-Science / arcadia-pycolor

tools for using the Arcadia palette in Python
MIT License
4 stars 0 forks source link

Implement `__copy__` and `__deepcopy__` methods for `HexCode` #54

Open mezarque opened 2 weeks ago

mezarque commented 2 weeks ago

Overview

When trying to use HexCode objects in plotly (not currently supported), we can run into problems caused by the way that plotly handles color objects; namely, that it uses deepcopy at some point in the figure generation process to create a copy of an input color object. Because of the way we developed HexCode to inherit from str, we don't currently override the __copy__ or __deepcopy__ methods. My guess is that this results in a problem when deepcopy is used on a HexCode object.

Example

Example Plotly code that causes an error:

import plotly.express as px

import arcadia_pycolor as apc

x = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]
c = ['A', 'B', 'A', 'A', 'B']

cmap = {
    'A': apc.teal,
    'B': apc.tangerine,
}

px.scatter(x, y, color = c, color_discrete_map=cmap)

Full traceback of error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[5], [line 15](vscode-notebook-cell:?execution_count=5&line=15)
      [8](vscode-notebook-cell:?execution_count=5&line=8) c = ['A', 'B', 'A', 'A', 'B']
     [10](vscode-notebook-cell:?execution_count=5&line=10) cmap = {
     [11](vscode-notebook-cell:?execution_count=5&line=11)     'A': apc.teal,
     [12](vscode-notebook-cell:?execution_count=5&line=12)     'B': apc.tangerine,
     [13](vscode-notebook-cell:?execution_count=5&line=13) }
---> [15](vscode-notebook-cell:?execution_count=5&line=15) px.scatter(x, y, color = c, color_discrete_map=cmap)

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:66, in scatter(data_frame, x, y, color, symbol, size, hover_name, hover_data, custom_data, text, facet_row, facet_col, facet_col_wrap, facet_row_spacing, facet_col_spacing, error_x, error_x_minus, error_y, error_y_minus, animation_frame, animation_group, category_orders, labels, orientation, color_discrete_sequence, color_discrete_map, color_continuous_scale, range_color, color_continuous_midpoint, symbol_sequence, symbol_map, opacity, size_max, marginal_x, marginal_y, trendline, trendline_options, trendline_color_override, trendline_scope, log_x, log_y, range_x, range_y, render_mode, title, template, width, height)
     [12](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:12) def scatter(
     [13](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:13)     data_frame=None,
     [14](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:14)     x=None,
   (...)
     [60](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:60)     height=None,
     [61](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:61) ) -> go.Figure:
     [62](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:62)     """
     [63](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:63)     In a scatter plot, each row of `data_frame` is represented by a symbol
     [64](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:64)     mark in 2D space.
     [65](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:65)     """
---> [66](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_chart_types.py:66)     return make_figure(args=locals(), constructor=go.Scatter)

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2332, in make_figure(args, constructor, trace_patch, layout_patch)
   [2323](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2323)         _set_trace_grid_reference(
   [2324](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2324)             trace,
   [2325](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2325)             fig.layout,
   (...)
   [2328](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2328)             trace._subplot_col,
   [2329](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2329)         )
   [2331](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2331) # Add traces, layout and frames to figure
-> [2332](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2332) fig.add_traces(frame_list[0]["data"] if len(frame_list) > 0 else [])
   [2333](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2333) fig.update_layout(layout_patch)
   [2334](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/express/_core.py:2334) if "template" in args and args["template"] is not None:

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:980, in Figure.add_traces(self, data, rows, cols, secondary_ys, exclude_empty_subplots)
    [904](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:904) def add_traces(
    [905](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:905)     self,
    [906](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:906)     data,
   (...)
    [910](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:910)     exclude_empty_subplots=False,
    [911](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:911) ) -> "Figure":
    [912](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:912)     """
    [913](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:913) 
    [914](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:914)     Add traces to the figure
   (...)
    [978](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:978) 
    [979](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:979)     """
--> [980](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:980)     return super(Figure, self).add_traces(
    [981](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:981)         data, rows, cols, secondary_ys, exclude_empty_subplots
    [982](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_figure.py:982)     )

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2192, in BaseFigure.add_traces(self, data, rows, cols, secondary_ys, exclude_empty_subplots)
   [2124](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2124) """
   [2125](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2125) Add traces to the figure
   [2126](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2126) 
   (...)
   [2188](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2188) Figure(...)
   [2189](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2189) """
   [2191](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2191) # Validate traces
-> [2192](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2192) data = self._data_validator.validate_coerce(data)
   [2194](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2194) # Set trace indexes
   [2195](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:2195) for ind, new_trace in enumerate(data):

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2684, in BaseDataValidator.validate_coerce(self, v, skip_invalid, _validate)
   [2682](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2682)         invalid_els.append(v_el)
   [2683](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2683) else:
-> [2684](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2684)     trace = self.get_trace_class(trace_type)(
   [2685](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2685)         skip_invalid=skip_invalid, _validate=_validate, **v_el
   [2686](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2686)     )
   [2687](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2687)     res.append(trace)
   [2689](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2689) if type_in_v_el:
   [2690](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/_plotly_utils/basevalidators.py:2690)     # Restore type in v_el

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_scatter.py:3386, in Scatter.__init__(self, arg, alignmentgroup, cliponaxis, connectgaps, customdata, customdatasrc, dx, dy, error_x, error_y, fill, fillcolor, fillpattern, groupnorm, hoverinfo, hoverinfosrc, hoverlabel, hoveron, hovertemplate, hovertemplatesrc, hovertext, hovertextsrc, ids, idssrc, legend, legendgroup, legendgrouptitle, legendrank, legendwidth, line, marker, meta, metasrc, mode, name, offsetgroup, opacity, orientation, selected, selectedpoints, showlegend, stackgaps, stackgroup, stream, text, textfont, textposition, textpositionsrc, textsrc, texttemplate, texttemplatesrc, uid, uirevision, unselected, visible, x, x0, xaxis, xcalendar, xhoverformat, xperiod, xperiod0, xperiodalignment, xsrc, y, y0, yaxis, ycalendar, yhoverformat, yperiod, yperiod0, yperiodalignment, ysrc, **kwargs)
   [3384](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_scatter.py:3384) _v = marker if marker is not None else _v
   [3385](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_scatter.py:3385) if _v is not None:
-> [3386](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_scatter.py:3386)     self["marker"] = _v
   [3387](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_scatter.py:3387) _v = arg.pop("meta", None)
   [3388](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/graph_objs/_scatter.py:3388) _v = meta if meta is not None else _v

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:4868, in BasePlotlyType.__setitem__(self, prop, value)
   [4866](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:4866) # ### Handle compound property ###
   [4867](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:4867) if isinstance(validator, CompoundValidator):
-> [4868](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:4868)     self._set_compound_prop(prop, value)
   [4870](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:4870) # ### Handle compound array property ###
   [4871](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:4871) elif isinstance(validator, (CompoundArrayValidator, BaseDataValidator)):

File ~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:5290, in BasePlotlyType._set_compound_prop(self, prop, val)
   [5287](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:5287)     curr_dict_val = None
   [5289](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:5289) if val is not None:
-> [5290](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:5290)     new_dict_val = deepcopy(val._props)
   [5291](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:5291) else:
   [5292](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/site-packages/plotly/basedatatypes.py:5292)     new_dict_val = None

File ~/miniconda3/envs/apc/lib/python3.12/copy.py:136, in deepcopy(x, memo, _nil)
    [134](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:134) copier = _deepcopy_dispatch.get(cls)
    [135](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:135) if copier is not None:
--> [136](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:136)     y = copier(x, memo)
    [137](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:137) else:
    [138](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:138)     if issubclass(cls, type):

File ~/miniconda3/envs/apc/lib/python3.12/copy.py:221, in _deepcopy_dict(x, memo, deepcopy)
    [219](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:219) memo[id(x)] = y
    [220](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:220) for key, value in x.items():
--> [221](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:221)     y[deepcopy(key, memo)] = deepcopy(value, memo)
    [222](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:222) return y

File ~/miniconda3/envs/apc/lib/python3.12/copy.py:162, in deepcopy(x, memo, _nil)
    [160](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:160)                 y = x
    [161](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:161)             else:
--> [162](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:162)                 y = _reconstruct(x, memo, *rv)
    [164](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:164) # If is its own copy, don't memoize.
    [165](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:165) if y is not x:

File ~/miniconda3/envs/apc/lib/python3.12/copy.py:253, in _reconstruct(x, memo, func, args, state, listiter, dictiter, deepcopy)
    [251](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:251) if deep and args:
    [252](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:252)     args = (deepcopy(arg, memo) for arg in args)
--> [253](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:253) y = func(*args)
    [254](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:254) if deep:
    [255](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:255)     memo[id(x)] = y

File ~/miniconda3/envs/apc/lib/python3.12/copyreg.py:99, in __newobj__(cls, *args)
     [98](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copyreg.py:98) def __newobj__(cls, *args):
---> [99](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copyreg.py:99)     return cls.__new__(cls, *args)

TypeError: HexCode.__new__() missing 1 required positional argument: 'hex_code'

Solution

For now, users can use the .hex_code property of a HexCode object to circumvent this limitation of our implementation. In the long term, we should consider implementing overrides of __copy__ and __deepcopy__ into HexCode to more easily support plotly.

mezarque commented 2 weeks ago

Some validation that this is the reason:

from copy import deepcopy

deepcopy(apc.teal)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[6], [line 3](vscode-notebook-cell:?execution_count=6&line=3)
      [1](vscode-notebook-cell:?execution_count=6&line=1) from copy import deepcopy
----> [3](vscode-notebook-cell:?execution_count=6&line=3) deepcopy(apc.teal)

File ~/miniconda3/envs/apc/lib/python3.12/copy.py:162, in deepcopy(x, memo, _nil)
    [160](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:160)                 y = x
    [161](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:161)             else:
--> [162](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:162)                 y = _reconstruct(x, memo, *rv)
    [164](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:164) # If is its own copy, don't memoize.
    [165](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:165) if y is not x:

File ~/miniconda3/envs/apc/lib/python3.12/copy.py:253, in _reconstruct(x, memo, func, args, state, listiter, dictiter, deepcopy)
    [251](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:251) if deep and args:
    [252](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:252)     args = (deepcopy(arg, memo) for arg in args)
--> [253](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:253) y = func(*args)
    [254](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:254) if deep:
    [255](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copy.py:255)     memo[id(x)] = y

File ~/miniconda3/envs/apc/lib/python3.12/copyreg.py:99, in __newobj__(cls, *args)
     [98](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copyreg.py:98) def __newobj__(cls, *args):
---> [99](https://file+.vscode-resource.vscode-cdn.net/Users/dennis/Code/arcadia-pycolor/~/miniconda3/envs/apc/lib/python3.12/copyreg.py:99)     return cls.__new__(cls, *args)

TypeError: HexCode.__new__() missing 1 required positional argument: 'hex_code'