python-humanize / python-humanize/humanize
precisedelta() silently drops the sign of negative timedeltas
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
precisedelta() silently drops the sign of negative timedeltas — the output is byte-identical to the positive counterpart, so a negative delta rendered in any UI becomes indistinguishable from a positive one.
Version: humanize 4.16.0 / current master. Python 3.13.
Repro
import datetime as dt
from humanize import precisedelta
td = dt.timedelta(seconds=-3661)
print(precisedelta(td)) # '1 hour, 1 minute and 1 second'
print(precisedelta(dt.timedelta(seconds=3661))) # '1 hour, 1 minute and 1 second' <- identical!
The sign is lost for every unit combination (also checked minimum_unit="minutes"). Neither the docstring nor the tests mention negative inputs at all, so it's unclear whether this is intended — but the current behavior makes the function unsafe for anything that can produce signed deltas (countdown corrections, progress deltas, A/B time differences), because the rendered string carries no trace of the direction.
For comparison, sibling function naturaldelta() also uses absolute value internally, but its output vocabulary ("a moment", "an hour") reads as inherently directionless; precisedelta's numeric output does not.
Suggested resolutions (either would work)
- Preserve the sign: prefix the result with
-whenvalueis negative (mirroringstr(timedelta), which keeps the sign:str(td)→'-1 day, 1:01:01'). - Or raise / document explicitly that only non-negative values are supported.
Option 1 seems most useful and backwards-compatible for positive inputs; option 2 at least removes the silent-corruption trap.
Happy to send a PR with either behavior + tests if maintainers indicate a preference.
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 l’implémentation de precisedelta(), sa docstring existante et ses tests, puis exécutez la reproduction fournie de negative-timedelta, y compris le cas minimum_unit="minutes". Ajoutez une couverture de régression pour les valeurs négatives et confirmez que le comportement choisi est cohérent, tout en préservant la sortie positive existante.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- Active
- Clarté
- Plutôt claire
- Accessibilité débutants
- 72/100