Skip to main content

Functional programming patterns for Python

Project description

better-py

Functional programming patterns for Python - pragmatic, type-safe, and developer-friendly.

CI Coverage PyPI Python License

✨ Features

Monads & Functional Types

  • Maybe[T] - Handle optional values safely
  • Result<T, E> - Explicit error handling
  • Either<L, R> - Two-value alternatives
  • Validation<T, E> - Accumulate validation errors
  • And more: Try, IO, Reader, Writer, State, Task, etc.

Functional Collections

  • MappableList[T] - List with functional operations
  • ImmutableDict[K, V] - Safe immutable dictionaries
  • LazySequence[T] - Lazy evaluation sequences
  • BidirectionalMap[K, V] - Two-way lookups

Function Utilities

  • curry(f) - Incremental argument application
  • compose(f, g) - Function composition
  • pipe(value, f, g) - Left-to-right pipelines
  • partial(f, ...) - Fix function arguments

OOP-First Design

  • Protocol-based (like collections.abc)
  • Generic types with full type hints
  • Method chaining and fluent APIs
  • Modern Python patterns (dataclasses, protocols, etc.)

🚀 Quick Start

from better_py import Maybe, Result, pipe

# Maybe: Safe optional handling
user = Maybe.from_value(get_user(id))
name = user.map(lambda u: u.name).unwrap_or_else(lambda: "Guest")

# Result: Explicit error handling
def divide(a: int, b: int) -> Result[float, str]:
    if b == 0:
        return Result.error("Division by zero")
    return Result.ok(a / b)

result = divide(10, 2)
if result.is_ok():
    print(f"Result: {result.unwrap()}")
else:
    print(f"Error: {result.unwrap_error()}")

# Pipe: Data pipelines
result = pipe(
    data,
    validate,
    transform,
    save
)

📦 Installation

# Install from PyPI
pip install better-py

# Or with uv (recommended)
uv pip install better-py

Requirements: Python 3.11+

📚 Documentation

💡 Why better-py?

Pragmatic FP

Not academic functional programming - practical patterns that make software development easier.

Type-Safe

Full type hints with mypy strict mode. Catch errors before runtime.

OOP-First

Everything is an object. Operations are functional. Works naturally with Python.

Developer-Friendly

Clear error messages, helpful APIs, extensive documentation.

🎯 Use Cases

# REST API error handling
from better_py import Result

async def get_user(id: int) -> Result[User, Error]:
    user = await db.fetch_user(id)
    if not user:
        return Result.error(Error("User not found"))
    return Result.ok(user)

# Data validation
from better_py import Validation

email_validated = Validation.validate(email, EmailValidator())
password_validated = Validation.validate(password, PasswordValidator())

user_validation = email_validated.and_then(password_validated)
if user_validation.is_valid():
    create_user(email, password)

# Data processing pipeline
from better_py import pipe

result = pipe(
    raw_data,
    clean,
    validate,
    transform,
    load_to_db
)

🏗️ Project Status

Current Version: 0.1.0 (Alpha)

What's Working:

  • ✅ Documentation framework
  • ✅ CI/CD pipeline
  • ✅ Type system design

In Development:

  • 🔄 Core protocols (Mappable, Reducible, etc.)
  • 🔄 Monad implementations
  • 🔄 Functional collections
  • 🔄 Function utilities

Planned:

  • 📋 More monads (Writer, State, etc.)
  • 📋 Performance benchmarks
  • 📋 Integration examples (FastAPI, SQLAlchemy, etc.)

See Issues for detailed roadmap.

🤝 Contributing

Contributions are welcome! Please see CONTRIBUTING.md for details.

Quick start:

# Clone repository
git clone https://github.com/nesalia-inc/better-py.git
cd better-py

# Install with uv
uv venv && source .venv/bin/activate  # Windows: .venv\Scripts\activate
uv sync --all-extras

# Run tests
uv run pytest

# Run checks
uv run ruff check .
uv run mypy better_py

📄 License

MIT License - see LICENSE for details.

🙏 Acknowledgments

Inspired by:

📮 Contact


Made with ❤️ by nesalia-inc

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

better_py_fp-0.2.0.tar.gz (34.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

better_py_fp-0.2.0-py3-none-any.whl (51.5 kB view details)

Uploaded Python 3

File details

Details for the file better_py_fp-0.2.0.tar.gz.

File metadata

  • Download URL: better_py_fp-0.2.0.tar.gz
  • Upload date:
  • Size: 34.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for better_py_fp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8337c8c3519e4d41a945a6e2924859de9da2cfa47934cd28e381f1acb8697147
MD5 7d6ddfd12457b4028eabf57223edf2c1
BLAKE2b-256 df0ad141de663d5a9a88670ed895d362131884d6a864dd06b0170ce8d235e740

See more details on using hashes here.

File details

Details for the file better_py_fp-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: better_py_fp-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 51.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.21 {"installer":{"name":"uv","version":"0.9.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Fedora Linux","version":"43","id":"","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for better_py_fp-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f7edb5310c44a5988c6e236471710c0af51e8becc16c0e395b6828d361670130
MD5 3d49b56cc82dd2a1b4c7c79157a7fbc2
BLAKE2b-256 1fd253fe8737717f83796e15f5813bed921391fc37dbf79924695463f3995243

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page