python-humanize / python-humanize/humanize
`naturalsize()` raises `ValueError` for custom format strings with text
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 756
- Forks
- 148
- Merge moyen
- 6 j 1 h
- PR mergées (30 j)
- 12
Description
Environment
- humanize 4.16.0 and current
mainat42b4a1db - Python 3.11.15
Reproduction
import humanize
print(humanize.naturalsize(999_999, gnu=True, format="Size: %.1f"))
humanize 4.15.0 returns:
Size: 976.6K
humanize 4.16.0 and current main raise:
ValueError: could not convert string to float: 'Size: 976.6'
Expected behavior
The documented custom formatter should continue to accept text around the numeric conversion.
Since this behavior worked in 4.15.0, preserving it would avoid a backward compatibility regression.
Cause
PR #329 added unit rollover handling. The new condition formats the mantissa with the
user-provided format and passes the entire result to float():
float(format % (abs_bytes / (base**exp)))
This works for a plain numeric format such as "%.1f", but not for a general formatter
such as "Size: %.1f".
Suggested fix
It might be preferable not to require the complete user-formatted result to be parseable as a float. One
backward-compatible option is to apply rollover only when the formatted result is a
plain numeric string, and otherwise preserve the pre-4.16 behavior. A more complete
solution could derive the rounded numeric mantissa independently from surrounding text.
It might also be worth adding a regression test covering both a prefix and a suffix.
How this was found
This was found by change-directed differential testing: reviewing the recent rollover change, mapping it to the public naturalsize() API, and constructing a documented custom formatter that reaches the newly added float(format % value) expression.
Related: #329, which fixes rollover but does not discuss custom format strings.
Thanks for taking the time to review this report! I appreciate all the work that goes into maintaining this project.
Guide de contribution
Ouvrir 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.
Piste de recherche
Commencez par le point d’entrée naturalsize() et examinez la gestion du report d’unité introduite par la PR #329, en particulier le chemin de format personnalisé décrit dans le rapport. Ajoutez une couverture de régression pour les chaînes de format comportant à la fois des préfixes et des suffixes, puis exécutez la suite de tests pertinente ; le travail est terminé lorsque ces formats préservent le comportement antérieur à la version 4.16 tout en assurant que le report fonctionne toujours pour les formats numériques simples.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- api
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- Calme
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 75/100