functools.singledispatch registration prioritizes the types of normal arguments before positional-only ones
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 35.9k
- PR merge metrics
- PR metrics pending
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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start from the functools.singledispatch registration path and reproduce the example with positional-only and normal arguments. Done means registration selects the first positional-only argument's type and the shown dispatch results match the expected output, with regression coverage added and the relevant tests passing.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 25/100