Union of ParamSpec?
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
Feature
Currently it's possible to concatenate a type to a paramspec to get a new paramspec.
I think I may need the ability to concatenate two paramspecs, like:
P = ParamSpec('P')
Q = ParamSpec('Q')
R = TypeVar("R")
Callable[Concatenate[P, Q], R]
Pitch
I'm trying to describe partial-like functions, I spotted https://github.com/python/mypy/pull/16939 which solves if for functools.partial (which is good) but still not giving a way to describe other partial-like functions.
Currently I can successfully describe the "removal" of one or multiple parameters:
from collections.abc import Callable
from typing import Concatenate, Generic, ParamSpec, TypeVar
P = ParamSpec('P')
Q = ParamSpec('Q')
S = TypeVar('S')
T = TypeVar('T')
U = TypeVar('U')
def substract_one_parameter(given: T, func: Callable[Concatenate[T, P], U]) -> Callable[P, U]:
def inner(*args: P.args, **kwargs: P.kwargs) -> U:
return func(given, *args, **kwargs)
return inner
def substract_two_parameters(first: S, second: T, func: Callable[Concatenate[S, T, P], U]) -> Callable[P, U]:
def inner(*args: P.args, **kwargs: P.kwargs) -> U:
return func(first, second, *args, **kwargs)
return inner
def int_int_int(a: int, b: int) -> int:
return a + b
c = substract_one_parameter(1, int_int_int)
reveal_type(c) # def (b: builtins.int) -> builtins.int
print(c(2))
d = substract_two_parameters(1, 2, int_int_int)
reveal_type(d) # def () -> builtins.int
print(d())
But what I think I need is:
# P are the "removed" parameters
# Q are the "kept" parameters
def substract_n_parameters(func: Callable[Concatenate[P, Q], U], *outer_args: P.args, **outer_kwargs: P.kwargs) -> Callable[Q, U]:
def inner(*args: Q.args, **kwargs: Q.kwargs) -> U:
return func(*outer_args, *args, **outer_kwargs, **kwargs)
return inner
I feel that would cleanly express the "removal" of P from [P, Q], without the need to introduce a new function like Difference[P, Q].
I feel like this could also be used for the real functools.partial, maybe simplifying the current (working, yeah) implementation.
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
No source files or tests are named. Start by comparing the existing ParamSpec and Concatenate behavior with the provided examples, then review the referenced functools.partial implementation and pull request. Done means determining whether two ParamSpecs can be concatenated and validating the proposed substract_n_parameters typing behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- developer-experience, devtools
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100