dry-python / dry-python/returns

support for Python's container interfaces

Open
#1,091 4 comments 3 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
4.4k
Forks
155
Avg merge
2h 27m
Merged PRs (30d)
22

Description

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... 👀

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.