Skip to content

Fix validate_colors and convert_colors_to_same_type modifying the colors passed to them - #5836

Open
Enesuygurs wants to merge 2 commits into
plotly:mainfrom
Enesuygurs:validate-colors-mutating-input
Open

Enesuygurs wants to merge 2 commits into
plotly:mainfrom
Enesuygurs:validate-colors-mutating-input

Conversation

@Enesuygurs

@Enesuygurs Enesuygurs commented Oct 22, 2026 •

Copy link
Copy Markdown

Link to issue

Fixes #5846

Description of change

plotly.colors.validate_colors and plotly.colors.convert_colors_to_same_type rewrite the list they are given in place.

  • validate_colors: when called with None, it uses DEFAULT_PLOTLY_COLORS itself, so the module-level default colors become float tuples for the rest of the session. create_trisurf does this whenever colormap is left as None. When a user passes a colormap list instead, that list is converted to tuples.
  • convert_colors_to_same_type: it aliases a list argument the same way, so passing a built-in sequence rewrites it:
import plotly.colors as pc

pc.convert_colors_to_same_type(pc.sequential.Inferno, colortype="rgb")
pc.sequential.Inferno[:2]      # ['rgb(0, 0, 4)', 'rgb(27, 12, 65)'] instead of ['#000004', '#1b0c41']

pc.validate_colors(None)
pc.DEFAULT_PLOTLY_COLORS[:1]   # [(0.1215..., 0.4666..., 0.7058...)] instead of ['rgb(31, 119, 180)']

Both functions now copy the list before converting it. The return values are unchanged.

Testing strategy

I added test_color_conversions_do_not_modify_input. It checks that DEFAULT_PLOTLY_COLORS and a user list are unchanged after calling both helpers. It fails on main and passes with this change.

Locally, tests/test_core/test_colors, tests/test_plotly_utils and tests/test_optional/test_figure_factory pass. The exception is the create_ternary_contour tests: they need scikit-image, which isn't installed here, and they fail the same way on main. ruff format --check . passes.

Additional information (optional)

This also fixes cross-test pollution in the existing suite. test_sample_colorscale calls convert_colors_to_same_type(colors.sequential.Inferno, ...), which rewrote Inferno. As a result, running tests/test_core/test_colors before tests/test_plotly_utils made test_colorscale_validator.py::test_acceptance_named[Inferno_r] fail on main. It passes with this change.

Guidelines

…nput

Both helpers rewrote the list passed to them in place, which also
changed DEFAULT_PLOTLY_COLORS (e.g. after create_trisurf without a
colormap) and built-in sequences such as plotly.colors.sequential.Inferno.
Copy the list before converting it.
@KoolADE85

Copy link
Copy Markdown
Contributor

Thanks for the PR! Can you please create an issue that describes the problem and how you encountered this issue in your day-to-day usage of plotly.py?

@Enesuygurs

Copy link
Copy Markdown
Author

Thanks for taking a look! I opened #5846 with a description and a short reproduction, and linked it from this PR. To be transparent: I came across this while reading the color utilities rather than hitting it in a project. The most visible effect is that a built-in sequence such as plotly.colors.sequential.Inferno (or DEFAULT_PLOTLY_COLORS) stays modified for the rest of the session after one of these helpers is called on it. It also causes an order-dependent failure in the existing test suite.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG]: validate_colors and convert_colors_to_same_type modify the colors passed to them

2 participants