Skip to main content

Easier Python lambdas

Project description

# Onthelam

Tired of painstakingly writing the characters lambda: every time you want a simple lambda function? Onthelam is the package for you.

`python >>> from onthelam import _ >>> mapping = dict(foo=2, bar=1, baz=3) >>> sorted_by_value = sorted(mapping.items(), key=_[1]) >>> sorted_by_value [('bar', 1), ('foo', 2), ('baz', 3)] `

Sure, you _could_ type lambda pair: pair[1], but doesn’t _[1] feel so much nicer? I think it does.

Onthelam supports painless definition of lambda functions that use any combination of comparators, arithmetic operations, bitwise operations, indexing, and attribute getting.

## Readable repr

Onthelam lambdas provide a user-friendly repr string for easier debugging.

`python >>> fn = -(_.count % 5 + 42) ** 3 >>> fn _ -> -(_.count % 5 + 42) ** 3 `

Can your native lambdas do that?

This is especially useful for logging errors in functions that accept functions as arguments, enabling you to log something about the argument that isn’t just <function <lambda>(x)>.

## Renamable

Maybe you take umbrage with my aesthetic choice to use an underscore as my lambda identifier. That’s fine. Rename it all you want:

`python >>> from onthelam import LambdaBuilder >>> λx = LambdaBuilder("λx") >>> [*map(λx // 2, range(10)] [0, 0, 1, 1, 2, 2, 3, 3, 4, 4] `

It uses whatever name you give it in its repr:

`python >>> λx // 2 λx -> λx // 2 `

## Composable

Need to use the same argument twice in your lambda? No sweat.

`pyrhon >>> tetration_2 = _ ** _ >>> tetration_2(5) 3125 `

Need a lambda with more than one argument? Combining lambda builders with different names gets you a function that takes as many arguments as you have distinct names.

`python >>> _a = LambdaBuilder("_a") >>> _b = LambdaBuilder("_b") >>> _b = LambdaBuilder("_c") >>> fn = _a[_b] + _c `

You still get a useful repr:

`python >>> fn _a, _b, _c -> _a[_b] + _c `

And it works like you’d expect it:

`python >>> fn([1, 2, 3], 2, 4) 7 `

Calling by keyword is permitted as well:

`python >>> fn(_b=2, _c=4, _a=[1, 2, 3]) 7 `

## Designed with itertools in mind

The itertools module in the standard library is incredibly powerful, but using it often results in ugly code where you have to decide whether to use inline lambdas which add a lot of line noise or lots of one-time named function definition blocks that take up a lot of space relative to their importance.

Consider the following implementation of tetration, the mathematical operation of iterated exponentiation of a number with itself.

`python >>> from functools import reduce >>> from itertools import repeat >>> def tetration(x, n): ... """Iterate `x ** x` n times""" ... return reduce(_a ** _b, repeat(x, n)) ... >>> tetration(5, 1) 5 >>> tetration(5, 2) 3125 >>> tetration(5, 3) 298023223876953125 `

Onthelam clears out the clutter from using lambdas.

## Limitations

Onthelam works by using the various special methods available to a class for customizing the behavior of an instance when it is operated on. In short: through lots of operator overloading. The limitation is that there are some expressions involving a LambdaBuilder instance that the object can’t seamlessly transform into a lambda function. As a result, they are interpreted as attempts to use the defined lambda function as a lambda function. These are:

  • Boolean contexts. Anything that tries to interpret the lambda argument’s truthiness will fail entirely. E.g., the expression 1 if _ else 0 will fail.

  • Use as the index to an object that is not itself a lambda argument. E.g., the expression [1, 2, 3][_] will fail.

  • Tests of containment. E.g., the expression _ in [1, 2, 3] will fail.

  • Using the lambda argument as an argument in a function call. E.g., the expression ord(_) will call the ord function with an identity lambda, not create a lambda which calls ord on its argument. Consider functools.partial for this case.

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

on-the-lam-1.0.0.tar.gz (9.0 kB view details)

Uploaded Source

Built Distribution

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

on_the_lam-1.0.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file on-the-lam-1.0.0.tar.gz.

File metadata

  • Download URL: on-the-lam-1.0.0.tar.gz
  • Upload date:
  • Size: 9.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.3.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.4

File hashes

Hashes for on-the-lam-1.0.0.tar.gz
Algorithm Hash digest
SHA256 14a729ba56a72434dc87e957768086efd718a903b888d81114ad2a9e6ddee715
MD5 0e55916cac57c67e80dd79ea77c7072c
BLAKE2b-256 26d29aed13edd94adccf62e2236c9923d69a4b36f3b42b598dcb3ed5447129d9

See more details on using hashes here.

File details

Details for the file on_the_lam-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: on_the_lam-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.3.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.4

File hashes

Hashes for on_the_lam-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f80e3b7036dc1bc7d4fed8ec76ba57991ec4b17cea0a56ad8f3b0e9234e26a82
MD5 8d5c8322dea51505a86db90f7d5d659e
BLAKE2b-256 282da6f4eebddf192670cea2f1c171f8e49b0bebbe473fb057bdfdbeb7fa4817

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