[BUG] Patch.update mutates a shared mapping and rewrites earlier merges

Aberta
#4,143 0 comentários 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

@peterolkhov já está trabalhando nisso.

Desde 12/11/2026.

  • #4144 de @peterolkhov — aberto

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Estagnada
Stack de tecnologia
python
Domínio
backend

Direção de pesquisa

Start by locating Patch.update and the code that records its merge operations; the issue provides a reproducer using a shared dictionary and to_json. Check the existing Patch tests for merge behavior, then verify that each location keeps its own amount and the input dictionary remains unchanged. Pull request #4144 is already open for this issue.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Patch.update uses its nonempty dictionary argument as the target for merging
keyword arguments. Reusing that dictionary for two locations in one callback
changes the value already queued for the first location.

import json

from dash import Patch
from dash._utils import to_json

common = {"currency": "USD"}
p = Patch()
p["jan"].update(common, amount=100)
p["feb"].update(common, amount=200)
print(json.dumps(json.loads(to_json(p)), indent=2))
print(common)

Expected merge values are {"currency": "USD", "amount": 100} for jan
and {"currency": "USD", "amount": 200} for feb. common should remain
{"currency": "USD"}. Both serialized merge values instead contain
"amount": 200, and common also gains "amount": 200.

The same callback was exercised in a running Dash app with a dcc.Store and
Chrome. Its actual Store data had amounts 200/200 instead of 100/200. Existing
fields at each location were retained. Distinct dictionary arguments and
keyword-only calls produced the expected 100/200 values.

The native diagnostic run is
https://github.com/peterolkhov/dash/actions/runs/43130587651/job/130893438856.
It checks the actual public producer and running browser, with two ordinary
assertion failures for the shared mapping and four passing controls.

Environment: unchanged Dash dev commit
b5a33c5b9191bef976e352b9feca14eaf93c9b7a, Dash 4.5.0, Python 3.12.16,
Node 24.22.2, Selenium 4.51.0, Chrome/ChromeDriver 157.0.8103.78, and Ubuntu
on a standard GitHub-hosted runner. The full npm run build completed first.

AI assistance was used to investigate and prepare this report. The observed
results above come from the linked native run.

Linguagem predominante
Python
Estrelas
24.5k
Forks
2.3k
Merge médio
3d 7h
PRs com merge (30d)
30

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de plotly/dash

Todas as issues de plotly/dash

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.