precisedelta() silently drops the sign of negative timedeltas
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 72/100
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.
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.
- Langage dominant
- Python
- Étoiles
- 757
- Forks
- 148
- Merge moyen
- 6 j 1 h
- PR mergées (30 j)
- 12
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.
Autres issues de python-humanize/humanize
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
python-humanize/humanize#366 ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 52/100
python-humanize/humanize#356 · 2 commentaires ·
-
Percentages and ratios Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 48/100
python-humanize/humanize#277 · 1 commentaire ·
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
python-humanize/humanize#270 · 6 commentaires ·
-
help wanted
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
python-humanize/humanize#263 · 3 réactions ·
Toutes les issues de python-humanize/humanize
Issues similaires
-
triage/confirmed
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
agentscope-ai/agentscope#2775 ·
-
comp/desktop P3 type/bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
NousResearch/hermes-agent#118866 ·
-
bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
apache/cloudstack#14222 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100