MyPy fails on Union[str, int] < Union[str, int] when underlying type is known
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 20.6k
- Forks
- 3.3k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug Report
Given the following script I'm receiving several unexpected errors:
test.py:22: error: Unsupported operand types for < ("str" and "int")
test.py:22: error: Unsupported operand types for < ("int" and "str")
test.py:22: note: Both left and right operands are unions
test.py:24: error: Unsupported operand types for < ("str" and "int")
test.py:24: error: Unsupported operand types for < ("int" and "str")
test.py:24: note: Both left and right operands are unions
Found 4 errors in 1 file (checked 1 source file)
Even though the if-block and assert statement just before the comparison operator usage on a and b clearly filters out the case of mismatching types. I've only added the assert statement in the hope of telling mypy that these variables have the same type, but no luck there.
from typing import Union
def semver_prerelease_compare(lhs: str, rhs: str) -> bool:
a: Union[str, int]
b: Union[str, int]
for a, b in zip(lhs.split("."), rhs.split(".")):
try:
a = int(a)
except ValueError:
pass
try:
b = int(b)
except ValueError:
pass
if isinstance(a, int) and not isinstance(b, int):
# Numeric identifiers sort before non-numeric ones
return True
if type(a) != type(b):
return False
if a < b:
return True
elif b < a:
return False
return len(lhs) < len(rhs)
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
Reproduisez les diagnostics signalés en exécutant mypy sur test.py, puis suivez l’impact de la condition de garde type(a) != type(b) sur le rétrécissement pour les comparaisons a < b et b < a. Le travail est terminé lorsque la condition de types équivalents ne produit plus les erreurs str/int signalées et que le comportement est couvert par un test de régression.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 42/100