iterpy
Python has implemented map, filter etc. as functions, rather than methods on a sequence. Since it does not contain a pipe operator, this makes the result harder to read. iterpy exists to change that.
You get this 🔥:
from iterpy import Iter
result = Iter([1,2,3]).map(multiply_by_2).filter(is_even)
Instead of this:
sequence = [1,2,3]
multiplied = [multiply_by_2(x) for x in sequence]
result = [x for x in multiplied if is_even(x)]
Or this:
result = filter(is_even, map(multiply_by_2, [1,2,3]))
Install
uv add iterpy
Usage
from iterpy import Arr
result = (Arr([1, 2])
.filter(lambda x: x % 2 == 0)
.map(lambda x: x * 2)
)
assert result == [4]
from iterpy import Iter
result = (Iter([1, 2])
.filter(lambda x: x % 2 == 0)
.map(lambda x: x * 2)
.to_list()
)
assert result == [4]
Lazy vs eager evaluation
Inspired by Polars, iterpy supports eager evaluation for easier debugging using Arr, and lazy evaluation for better performance using Iter. To access eager evaluation:
from iterpy import Arr
result = Arr([1, 2, 3]).map(lambda x: x * 2).to_list()
assert result == [2, 4, 6]
Arr acts like a Python list, so it has a super simple API you can easily use anywhere.
To access lazy evaluation, just rename Arr to Iter:
from iterpy import Iter
result = Iter([1, 2, 3]).map(lambda x: x * 2).to_list()
assert result == [2, 4, 6]
Prior art
iterpy stands on the shoulders of Scala, Rust etc.
Other Python projects have had similar ideas:
- PyFunctional has existed for 7+ years with a comprehensive feature set. It is performant, with built-in lineage and caching. Unfortunately, this makes typing non-trivial, with a 4+ year ongoing effort to add types.
- flupy is highly similar, well typed, and mature. I had some issues with
.flatten()not being type-hinted correctly, but but your mileage may vary. - Your library here? Feel free to make an issue if you have a good alternative!
Contributing
Setup
- We use
uvfor environment management. Once it is installed, setup the dev environment usingmake dev.
Or, use the devcontainer.
- Install Orbstack or Docker Desktop. Make sure to complete the full install process before continuing.
- If not installed, install VSCode
- Press this link
Changes
-
Make your changes
-
See the makefile for tests, linting, and formatting.
Conventions
- Make it work: Concise syntax borrowed from Scala, Rust etc.
- Make it right: Fully typed in the public interface
- For pyright and ty
- Make it fast:
- Concurrency through
.pmap - (Future): Caching
- (Future): Refactor operations to use generators
- Concurrency through
- Keep it simple: No dependencies
API design
As a heuristic, we follow the APIs of:
In cases where this conflicts with typical python implementations, the API should be as predictable as possible for Python users.
💬 Where to ask questions
| Type | |
|---|---|
| 🚨 Bug Reports | GitHub Issue Tracker |
| 🎁 Feature Requests & Ideas | GitHub Issue Tracker |
| 👩💻 Usage Questions | GitHub Discussions |
| 🗯 General Discussion | GitHub Discussions |
Metadata
Release files for iterpy 1.15.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| iterpy-1.15.0.tar.gz | 89.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| iterpy-1.15.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 101.6 kB
Release files / iterpy-1.15.0.tar.gz
| Download URL | iterpy-1.15.0.tar.gz |
|---|---|
| Size | 89.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a7eb5a22f2c905f8290f43a3a356b529eb87791cfbb0bacf46e50d542a473e59
|
|
BLAKE2b-256 checksum How to use checksums |
44a32d3aa307cb651ffb4cf397778989f836a792ea5a9b02550633e6dcd0b40a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / iterpy-1.15.0-py3-none-any.whl
| Download URL | iterpy-1.15.0-py3-none-any.whl |
|---|---|
| Size | 12.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e2b26d9b6d09b476d7a41ff98b4b2932c6a93322ddf1a9013420845fdbef3176
|
|
BLAKE2b-256 checksum How to use checksums |
fc22bdefeabb9275dad279e57f513c4271f995ad4ae9c8f136cd7c856e8179f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency log