Skip to main content

Composable Python for production via syntactic sugar

Project description

test codecov Documentation Status PyPI version

Why pysweet?

Python can sometimes be unwieldy in production.

Consider the following 3 variants of the same logic:

acc = []

for x in range(10):
    y = x + 1

    if y % 2 == 0:
        acc.extend([y, y * 2])
acc = [
    z for y in (x + 1 for x in range(10))
    for z in [y, y * 2] if y % 2 == 0
]
from itertools import chain

acc = list(chain.from_iterable(map(
    lambda x: [x, x * 2],
    filter(
        lambda x: x % 2 == 0,
        map(lambda x: x + 1, range(10)),
    ),
)))
  • The first is in the imperative style; it can become convoluted as requirements evolve.

  • The second uses comprehensions, which can get complicated when nested.

  • The last utilizes functional programming: more modular, but not as readable.

In JavaScript, the same logic is simpler:

acc = [...Array(10).keys()]
    .map(x => x + 1)
    .filter(x => x % 2 === 0)
    .flatMap(x => [x, x * 2])

Can we write analogous code in Python?

Now you can with pysweet:

from pysweet import Iterable_

acc = (
    Iterable_(range(10))
    .map(lambda x: x + 1)
    .filter(lambda x: x % 2 == 0)
    .flat_map(lambda x: [x, x * 2])
    .to_list()
)

Compared to many excellent alternatives, pysweet is lightweight with fewer than 100 lines of code.

Being only syntactic sugar, pysweet:

  • has little performance overhead;

  • does not complicate debugging;

  • makes onboarding new developers easy.

pysweet has successfully been used in production.

Sweeten Python with pysweet!

Features

Fluent iterable

Iterable with method chaining in the style of JavaScript and Scala.

from pysweet import Iterable_

(
    Iterable_([1, 2])
    .map(lambda x: x + 1)
    .to_list()
)
# [2, 3]

Multi-expression lambda

As in many modern languages, even a systems one like Go.

from pysweet import block_

val = lambda: block_(
    x := 1,
    x + 1,
)
# val() == 2

Statements as expressions

Composable control flow as in functional languages such as Scala and Haskell.

Bonus: if_ is the ternary operator in the natural order.

from pysweet import if_, try_, raise_

if_(
    True,
    lambda: 1,
    lambda: 2,
)
# 1

try_(
    lambda: raise_(Exception('test')),
    catch=lambda e: str(e),
)
# 'test'

Documentation

Installation

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

pysweet-func-1.0.8.tar.gz (5.4 kB view hashes)

Uploaded Source

Built Distribution

pysweet_func-1.0.8-py3-none-any.whl (5.7 kB view hashes)

Uploaded Python 3

Supported by

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