dry-python / dry-python/returns

Currying support for generic attrs classes

Abierto
#1,100 2 comentarios 0 reacciones 0 asignados Ver en GitHub
bug
Lenguaje dominante
Python
Estrellas
4.4k
Forks
155
Merge medio
2 h 27 min
PR fusionados (30 d)
22

Descripción

# Bug report

I tried out returns, because I was looking for typesafe curry implementation, but I hit a problem with my Generic / Protocol implementing attrs classes.

## What's wrong
```python
from typing import TypeVar, Generic

from attr import frozen
from returns.curry import curry

T = TypeVar("T")

@curry
@frozen(kw_only=True)
class Pair(Generic[T]):
_a: T
_b: T

p = Pair(b=1)(a=2)
print(p)

```
```
TypeError: __init__() missing 1 required keyword-only argument: 'a'
```

## How is that should be

The above code should simply print

`Pair(_a=2, _b=1)`

This seems to be due to https://github.com/python-attrs/attrs/issues/374

A fix I hacked together could be something like this.

```python
def curry(function: Callable[..., _ReturnType]) -> Callable[..., _ReturnType]:
import inspect
if inspect.isclass(function):
init_signature = Signature.from_callable(function.__init__)
init_params_without_self = tuple(init_signature.parameters.values())[1:]
argspec = init_signature.replace(parameters=init_params_without_self).bind_partial()
else:
argspec = Signature.from_callable(function).bind_partial()

def decorator(*args, **kwargs):
return _eager_curry(function, argspec, args, kwargs)
return wraps(function)(decorator)
```

If you are interested in support this admittedly special use case, I could submit a PR.

## System information

- `python` version: 3.7
- `returns` version: 0.17.0
- `mypy` version: 0.910

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.