Skip to main content

Eff

Eff is a Python library to work with algebraic effects.

Algbraic effects are all side-effects of a piece of code, like reading a user input, writing a text on the screen, doing network requests, reading a file etc. Eff allows to easily handle such effects making the code cleaner and testing easier.

Features:

  • Easy to understand. You don't need to read long scientific papers to understand how to use the library and what it does.
  • Easy to integrate. If you decided to add a logger into a function, changes will be minimal, no need to pass the logger down through the whole call stack.
  • Fast. The classic approach for handling algebraic effects is using coroutines or exceptions. This library uses global shared state instead which doesn't require to unwrap the whole call stack at runtime.
  • Type-safe. Effect handlers container is just a class. Annotate effect handlers type to make their usage type-safe.

Installation

python3 -m pip install --user eff

Usage

from io import StringIO
from typing import Callable

import eff

class Eff(eff.ects):
    show: Callable

# Use global effects manager in a function.
def greet(username: str) -> None:
    Eff.show(f'Hello, {username}!')

# Provide actual side-effects handlers
# for the project prod entry point.
def main() -> None:
    with Eff(show=print):
        greet('World')

# Mock side-effects in tests.
def test_greet() -> None:
    stream = StringIO()
    with Eff(show=stream.write):
        greet('World')
    stream.seek(0)
    assert stream.read() == 'Hello, World!'

if __name__ == '__main__':
    main()

Further reading

You don't have to read it but it's a good reading for better understanding of the motivation behind the library.

Release files for eff 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for eff 1.0.0
File Size Uploaded
eff-1.0.0.tar.gz 4.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for eff 1.0.0
File Interpreter ABI Platform
eff-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 8.1 kB

Release files / eff-1.0.0.tar.gz

Download URL eff-1.0.0.tar.gz
Size 4.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a2d8698c8c3fc056235ddc86e48046f8294a44d8f78d93306ef75c4127b4652f
BLAKE2b-256 checksum
How to use checksums
1e760d137c6919eedb06d2dc1e5dc69903218eeb2085b6b060ab8f06b265cb4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via DepHell/0.8.3

Release files / eff-1.0.0-py3-none-any.whl

Download URL eff-1.0.0-py3-none-any.whl
Size 4.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ad5e686eaf58e292c2231a152cde31cf4ee780d4906c1b8a116d5cfbec5cbd94
BLAKE2b-256 checksum
How to use checksums
a11ace172efccb099e8604c646b77a1ba190adcc33ae48db01f98c4fb7fd2ae9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via DepHell/0.8.3

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page