dry-python / dry-python/returns

support for Python's container interfaces

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

Descripción

related: #874, #592

Python has a [rich set of container interfaces](https://docs.python.org/3/library/collections.abc.html), like `__iter__`, `__len__`, `__contains__`, and others.

**could we treat `Maybe` as a collection (i.e. one containing 0 or 1 items)?** It may seem weird, but it has precedent. In Rust, `Option` implements iteration and other collection-like traits [as well](https://doc.rust-lang.org/std/option/).

### ...but why?

- It'd be consistent to make the containers in `returns` compatible with the Python builtin containers. You get expected behavior (empty containers are falsey), and it fits in the universe of iterables and `itertools`.
- It can enable some nice use-cases (Some more contrived than others, I must admit 😉 )

```python
>>> def parse_int(s: str) -> Maybe[int]: ...

>>> # easier flattening with `__iter__`
>>> list(chain.from_iterable(map(parse_int, 'a45bf'))))
[4, 5]

>>> # truthiness with `__bool__`
>>> if parse_int(mystr):
... print('a valid int!')

>>> # checking contents with `__contains__`
>>> if 5 in parse_int(mystr):
... print('number five detected!')

>>> # not strictly collection-related but still nice: __or__ and __and__
>>> Some(5) & Some(9)
Some(9)
>>> Some(9) & Nothing
Nothing
>>> Nothing & Some(8)
Nothing
>>> Some(5) | Some(9)
Some(5)
>>> Some(9) | Nothing
Some(9)
>>> Nothing | Some(8)
Some(8)
>>> Nothing | Nothing
Nothing

>>> # if you want to go crazy: use __getitem__ to implement Sequence
>>> Some(6)[0]
6
>>> Some(8)[8]
Exception: IndexError
>>> Nothing[0]
Exception: IndexError
...
>>> Some(6)[:]
Some(6)
>>> Some(2)[:9:4]
Some(2)
>>> Some(7)[2:]
Nothing
>>> Nothing[:]
Nothing
>>> Nothing[2:9:5]
Nothing

```

I'm sure you have some opinion on this, but couldn't find it in the issues so far... 👀

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.