Как набрать частичное применение? ⇐ Python

Программы на Python
Anonymous
Как набрать частичное применение?

Сообщение Anonymous »

Как ввести частичное приложение (желательно с синтаксисом 3.12)? С помощью следующей простой реализации:

Код: Выделить всё

class simple_partial:
def __init__(self, f: Callable, *args, **kwargs) -> None:
self.f = f
self.args = args
self.kwargs = kwargs

def __call__(self, *args, **kwargs):
return self.f(*(*self.args, *args), **(self.kwargs | kwargs))

partially = simple_partial(lambda x, y, z=3: (x, y, z), 1)
partially(2)
Единственное, что я могу придумать, это что-то вроде:

Код: Выделить всё

class simple_partial[T, **P]:
def __init__(self, f: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> None:
self.f = f
self.args = args
self.kwargs = kwargs

def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T:
return self.f(*(*self.args, *args), **(self.kwargs | kwargs))
но это неверно, потому что это не означает, что args/kwargs потенциально неполны и на самом деле P.args и P.kwargs будут разными в __init__ и __call__. Возможно, это можно сделать, набрав.Concatenate и два ParamSpec, но Concatenate не позволяет использовать два ParamSpec.
Изменить: две версии ParamSpec:

Код: Выделить всё

class simple_partial[T, **P, **P2]:
def __init__(
self, f: Callable[Concatenate[P, P2], T], *args: P.args, **kwargs: P.kwargs
) -> None:
self.f = f
self.args = args
self.kwargs = kwargs

def __call__(self, *args: P2.args, **kwargs: P2.kwargs) -> T:
return self.f(*(*self.args, *args), **(self.kwargs | kwargs))

Код: Выделить всё

ConcatenateОднако 
не допускает двух ParamSpec.


Подробнее здесь: https://stackoverflow.com/questions/790 ... pplication

Вернуться в «Python»