Functional programming pipeline for Python with chainable operations, lazy evaluation, and elegant placeholder syntax
Project description
PyFunc: Functional Programming Pipeline for Python
PyFunc is a Python library that brings functional programming fluency to Python, enabling chainable, composable, lazy, and debuggable operations on various data structures.
✨ Features
- 🔗 Chainable Operations: Method chaining for readable data transformations
- 🎯 Placeholder Syntax: Use
_to create lambda-free expressions - ⚡ Lazy Evaluation: Operations computed only when needed
- 🔄 Function Composition: Compose functions with
>>and<<operators - 📊 Rich Data Operations: Works with scalars, lists, dicts, generators
- 🐛 Built-in Debugging: Debug and trace pipeline execution
- 🔧 Extensible: Register custom types and extend functionality
- 📝 Type Safe: Full type hints and generic support
🚀 Quick Start
pip install pyfunc-pipeline
from pyfunc import pipe, _
# Basic pipeline
result = pipe([1, 2, 3, 4]).filter(_ > 2).map(_ * 10).to_list()
# Result: [30, 40]
# String processing
result = pipe("hello world").explode(" ").map(_.capitalize()).implode(" ").get()
# Result: "Hello World"
# Function composition
double = _ * 2
square = _ ** 2
composed = double >> square # square(double(x))
result = pipe(5).apply(composed).get()
# Result: 100
🎯 Core Concepts
Pipeline Chaining
Every value can be lifted into a pipeline for transformation:
from pyfunc import pipe, _
# Numbers
pipe([1, 2, 3, 4]).filter(_ > 2).map(_ ** 2).sum().get()
# Result: 25
# Strings
pipe(" hello world ").apply(_.strip().title()).explode(" ").to_list()
# Result: ['Hello', 'World']
# Dictionaries
pipe({"a": 1, "b": 2}).map_values(_ * 10).get()
# Result: {"a": 10, "b": 20}
Placeholder Syntax
The _ placeholder creates reusable, composable expressions:
from pyfunc import _
# Arithmetic operations
double = _ * 2
add_ten = _ + 10
# Method calls
normalize = _.strip().lower()
# Comparisons
is_positive = _ > 0
# Composition
process = double >> add_ten # add_ten(double(x))
Lazy Evaluation
Operations are lazy by default - perfect for large datasets:
# Processes only what's needed from 1 million items
result = pipe(range(1_000_000)).filter(_ > 500_000).take(5).to_list()
📚 Rich API
String Operations
pipe("hello,world").explode(",").map(_.capitalize()).implode(" & ").get()
# "Hello & World"
pipe("Hello {name}!").template_fill({"name": "PyFunc"}).get()
# "Hello PyFunc!"
Dictionary Operations
users = {"alice": 25, "bob": 30}
pipe(users).map_values(_ + 5).map_keys(_.title()).get()
# {"Alice": 30, "Bob": 35}
Advanced Transformations
# Group by
data = [{"name": "Alice", "dept": "Eng"}, {"name": "Bob", "dept": "Sales"}]
pipe(data).group_by(_["dept"]).get()
# Sliding windows
pipe([1, 2, 3, 4, 5]).window(3).to_list()
# [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
# Combinations
pipe([1, 2, 3]).combinations(2).to_list()
# [(1, 2), (1, 3), (2, 3)]
Side Effects & Debugging
pipe([1, 2, 3, 4])
.debug("Input")
.filter(_ > 2)
.debug("Filtered")
.map(_ ** 2)
.to_list()
🌟 Real-World Example
from pyfunc import pipe, _
# Process user data
users = [
{"name": " Alice ", "age": 30, "scores": [85, 92, 78]},
{"name": "BOB", "age": 25, "scores": [90, 88, 95]},
{"name": "charlie", "age": 35, "scores": [75, 80, 85]},
]
top_performers = (
pipe(users)
.map(lambda user: {
"name": pipe(user["name"]).apply(_.strip().title()).get(),
"age": user["age"],
"avg_score": pipe(user["scores"]).sum().get() / len(user["scores"])
})
.filter(lambda user: user["avg_score"] > 80)
.sort(key=lambda user: user["avg_score"], reverse=True)
.to_list()
)
print(top_performers)
# [{'name': 'Bob', 'age': 25, 'avg_score': 91.0},
# {'name': 'Alice', 'age': 30, 'avg_score': 85.0}]
📖 Documentation
- Complete Documentation - Full API reference and examples
- Examples - Real-world usage examples
- Changelog - Version history and updates
🤝 Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
📄 License
MIT License - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyfunc_pipeline-0.3.0.tar.gz.
File metadata
- Download URL: pyfunc_pipeline-0.3.0.tar.gz
- Upload date:
- Size: 19.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
216250f20cfc57914bae51de3864a4815ed8a41b58e6a843f2a21d23486c13b6
|
|
| MD5 |
51584053fcfb310bf6a81d9436effb96
|
|
| BLAKE2b-256 |
f52b84b808c5cf85b2c9e11fd5eee2ace82aa4bd9ca141393c480c967d424b11
|
File details
Details for the file pyfunc_pipeline-0.3.0-py3-none-any.whl.
File metadata
- Download URL: pyfunc_pipeline-0.3.0-py3-none-any.whl
- Upload date:
- Size: 13.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cedd1f34e7008553d57a6a939a099090531259240156f86bf7172dec68106f23
|
|
| MD5 |
5f20c09f919579c942f48a2a779e2961
|
|
| BLAKE2b-256 |
d766514cd04318bda8758a7803ac883c949676acf9dbca336a1ac1e8f4d921e8
|