to_typed_array_spec encodes bdata in host byte order; plotly.js always decodes it as little-endian
Les mainteneurs répondent en général sous 2 jours
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 79/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- numpy, python
- Domaine
- backend, data-visualization
Piste de recherche
Commencez dans _plotly_utils/utils.py, à to_typed_array_spec (vers la ligne 84), et suivez la sélection du dtype du tableau et l’encodage de ses octets. Vérifiez le comportement avec des tableaux little-endian et big-endian, y compris la reproduction fournie. Le travail est terminé lorsque les données encodées sont décodées en little-endian pour retrouver les valeurs numériques d’origine et qu’un test de régression couvre le cas signalé.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
to_typed_array_spec (_plotly_utils/utils.py:84) does:
arrObj = {
"dtype": plotlyjsShortTypes[dtype],
"bdata": base64.b64encode(v).decode("ascii"),
}
with no explicit byte-order normalization before encoding, so bdata follows whatever byte order the array's dtype naturally has, which for an array built without an explicit </> prefix is the host's native order.
plotly.js decodes bdata with new Float64Array(buffer), which always reads in the platform's native order, little-endian in every real browser. On a big-endian host, this means bdata ships bytes that no browser can read correctly.
Repro (confirmed on real big-endian hardware: z/OS/s390x, numpy 2.5.3)
Through the actual function, not just a standalone simulation:
import numpy as np
from _plotly_utils.utils import to_typed_array_spec
v = np.array([1.1, 2.3, 3.5])
spec = to_typed_array_spec(v)
print(spec)
import base64
raw = base64.b64decode(spec["bdata"])
as_little = np.frombuffer(raw, dtype="<f8") # what plotly.js's Float64Array reads
print("decoded as browser Float64Array would read it:", as_little)
print("matches original:", np.array_equal(v, as_little))
Output:
{'dtype': 'f8', 'bdata': 'P/GZmZmZmZpAAmZmZmZmZkAMAAAAAAAA'}
decoded as browser Float64Array would read it: [-1.54234871e-180 1.90359857e+185 1.54938987e-320]
matches original: False
So any big-endian host produces charts with silently corrupted numeric data.
Suggested fix
Normalize v to little-endian before encoding, e.g. v = v.astype(v.dtype.newbyteorder("<")) immediately before the base64.b64encode(v) call. Verified this resolves it on the same hardware:
v_fixed = v.astype(v.dtype.newbyteorder("<"))
bdata_fixed = base64.b64encode(v_fixed).decode("ascii")
raw_fixed = base64.b64decode(bdata_fixed)
as_little_fixed = np.frombuffer(raw_fixed, dtype="<f8")
print(np.array_equal(v, as_little_fixed)) # True
Originally spotted by @chrikrah in #5833;
- Langage dominant
- Python
- Étoiles
- 18.9k
- Forks
- 2.9k
- Merge moyen
- 2 j 7 h
- PR mergées (30 j)
- 12
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de plotly/plotly.py
-
[BUG]: NaT inside a datetime64 array serializes as the string "NaT" instead of nullPeut-être pris @senanurcetin l’a pris il y a 5 jours. Ouvertebug P3 size: 1
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
plotly/plotly.py#5829 · 3 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
[BUG]: Integer and string properties reject NumPy scalarsPeut-être pris @RaphaelFakhri l’a pris il y a 6 jours. Ouvertebug P3 size: 1
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
plotly/plotly.py#5827 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
[BUG]: Single-color requests raise ZeroDivisionError in palette helpersPeut-être pris @MokiMeow l’a pris il y a 16 jours. Ouvertebug P3 size: 1
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
plotly/plotly.py#5805 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
[BUG]: Unnecessary `UserWarning` when using `fig.write_image()` with `kaleido.start_sync_server()`Peut-être pris @jayzhou2309 l’a pris il y a 24 jours. Ouvertebug P3 size: 1
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
plotly/plotly.py#5786 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
P3 size: 1 task
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
plotly/plotly.py#5769 · 1 réaction ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de plotly/plotly.py
Issues similaires
-
request-theme
Difficulté 1/5 Moins d'une heure Accessibilité débutants 66/100
LizardByte/ThemerrDB#9575 ·
Les mainteneurs répondent en général sous 1 jour
-
Author Page: noshin-nawalOuverteauthor-page correction
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
acl-org/acl-anthology#10599 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
zilliztech/memsearch#818 ·
Les mainteneurs répondent en général sous 1 jour
-
[FAQ] Commit ID for ProjectsPeut-être pris @github-actions l’a pris aujourd’hui. Ouvertefaq-proposal
Difficulté 1/5 Moins d'une heure Accessibilité débutants 84/100
DataTalksClub/faq#503 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
README.zh-CN/ja/es still hard-code 501 test counts after README.md went count-freePeut-être pris @Aaqibhafeezkhan l’a pris aujourd’hui. Ouvertebeginner documentation good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
BistaDinesh03/critique#164 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour