Skip to main content

More Streams! Chained function calls

Project description

More Streams!!

PyPI Latest Release Build Status Coverage Status Downloads

Python code is more elegant with method chaining!

Overview

There are two families of "streams" in this library, both are lazy:

  1. ByteStream - a traditional stream of bytes intended to pipe bytes through various byte transformers, like compression, encoding and encyrption.
  2. ObjectStream: An iterator/generator with a number of useful methods.

Example

In this case I am iterating through all files in a tar and parsing them:

results = (
    File("tests/so_queries/so_queries.tar.zst")
    .content()
    .content()
    .exists()
    .utf8()
    .to_str()
    .map(parse)
    .to_list()
)

Each of the steps constructs a generator, and no work is done until the last step

  • File().content() - will unzst and untar the file content to an ObjectStream of file-like objects. It is short form for stream(File().read_bytes()).from_zst().from_tar()
  • The second .content() is applied to each of the file-like objects, returning ByteStream of the content for each
  • .exists() - some of the files (aka directories) in the tar file do not have content, we only include content that exists.
  • .utf8 - convert to a StringStream
  • .to_str - convert to a Python str, we trust the content is not too large
  • .map(parse) - run the parser on each string
  • .to_list() - a "terminator", which executes the chain and returns a Python list with the results

Project Status

Alive and in use, but

  • basic functions missing
  • inefficient - written using generators
  • generators not properly closed

Optional Reading

The method chaining style has two distinct benefits

  • functions are in the order they are applied
  • intermediate values need no temporary variables

The detriments are the same that we find in any declarative language: Incorrect code can be difficult to debug because you can not step through it to isolate the problem. For this reason, the majority of the code in this library is dedicated to validating the links in the function chain before they are run.

Lessons

The function chaining style, called "streams" in Java or "linq" in C#, leans heavly on the strict typed nature of those langauges. This is missing in Python, but type annotations help support this style of programming.

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

mo_streams-1.589.24111.tar.gz (22.0 kB view details)

Uploaded Source

Built Distribution

mo_streams-1.589.24111-py3-none-any.whl (24.8 kB view details)

Uploaded Python 3

File details

Details for the file mo_streams-1.589.24111.tar.gz.

File metadata

  • Download URL: mo_streams-1.589.24111.tar.gz
  • Upload date:
  • Size: 22.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.9.6

File hashes

Hashes for mo_streams-1.589.24111.tar.gz
Algorithm Hash digest
SHA256 1196f9f6ec6dc23351d5dd3ba5c8e0834fce57ca02035d6e68b5fa8856fdf617
MD5 3a12591edbca4b64efbee797dec99347
BLAKE2b-256 a4c97d6fba31b2caa36bff8e56cce6810b22b3f597cab2ea28acf2bb0da4b806

See more details on using hashes here.

File details

Details for the file mo_streams-1.589.24111-py3-none-any.whl.

File metadata

File hashes

Hashes for mo_streams-1.589.24111-py3-none-any.whl
Algorithm Hash digest
SHA256 c8ae3999e15999b0eefa399a4e2b0e67c6b81a34df795e8fbd251b46b90f5017
MD5 12fa42acb2d4f6ec989eeeb8a0ada6b3
BLAKE2b-256 1d264f6a0415fa62dd9a0d6565c50b0db818c61b3bd4c8283234f139639907d7

See more details on using hashes here.

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