functools.singledispatch registration prioritizes the types of normal arguments before positional-only ones
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
Decorator-based functools.singledispatch registration prioritizes the types of normal arguments before positional-only ones when getting "the type of the first argument".
This means that a function of def f(pos: str, /, other: int) will be registered to be dispatched for other's type (int) instead of pos (str).
To reproduce:
import functools
@functools.singledispatch
def f(arg, /, extra):
return f"{arg}: undispatched type"
@f.register
def f_int(arg: int, /, extra: str):
return f"{arg} is a {type(arg)} (dispatched by int)"
@f.register
def f_str(arg: str, /, extra: int):
return f"{arg} is a {type(arg)} (dispatched by str)"
print(f(None, "extra"))
print(f(1, "extra"))
print(f("s", "extra"))
Result:
None: undispatched type
1 is a <class 'int'> (dispatched by str)
s is a <class 'str'> (dispatched by int)
Expected:
None: undispatched type
1 is a <class 'int'> (dispatched by int)
s is a <class 'str'> (dispatched by str)
CPython versions tested on:
3.9, 3.10, 3.11, 3.12, 3.13, 3.14, CPython main branch
Operating systems tested on:
macOS
Linked PRs
- gh-143888
- gh-143465
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 chemin d’enregistrement de functools.singledispatch et reproduisez l’exemple avec des arguments positionnels uniquement et des arguments normaux. Le travail est terminé lorsque l’enregistrement sélectionne le type du premier argument positionnel uniquement, que les résultats de dispatch affichés correspondent à la sortie attendue, qu’une couverture de régression a été ajoutée et que les tests concernés passent.
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é
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 25/100