dry-python / dry-python/returns

support for Python's container interfaces

Đang mở
#1,091 4 bình luận 3 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Python
Star
4.4k
Fork
155
Merge trung bình
2 giờ 27 phút
Pull request đã merge (30 ngày)
22

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.