Skip to main content

A pattern matching and template library.

Project description

Matcho

A pattern matching and template library.

Macho was originally written by a need to convert hierarchical JSON data into flattish data frames. It may yet transcend this purpose.

Installation

pip install matcho

Quick Start

from matcho import build_matcher, build_template, bind, insert

# match a list of any length and bind "x" to its items
matcher = build_matcher([bind("x"), ...])

# match some data
bindings = matcher([1, 2, 3])

# a template that reconstructs the original list
template = build_template([insert("x"), ...])

assert template(bindings) == [1, 2, 3]

Motivating example

What if you want to convert data from a deeply nested structure like JSON to a flat tabular format?

For example, say we want to extract the columns "date", "time", "station" and "event_type" from the following structure:

data = {
    "date": "2022-02-20",
    "uid": "DEADBEEF",
    "reports": [
        {
            "station": 7,
            "events": [
                {"time": 1300, "type": "ON"},
                {"time": 1700, "type": "OFF"}
            ]
        },
        {
            "station": 5,
            "events": [
                {"time": 1100, "type": "ON"},
                {"time": 1800, "type": "OFF"}
            ]
        }
    ]
}

That's how a Matcho would do it:

from matcho import build_matcher, build_template, bind, insert

pattern = {
        "date": bind("date"),
        "reports": [
            {
                "station": bind("station"),
                "events": [{"time": bind("time"), "type": bind("event_type")}, ...],
            },
            ...,  # note that the ... really are Python syntax
        ],
    }

template_spec = [
        [insert("date"), insert("time"), insert("station"), insert("event_type")],
        ...,
        ...,  # note that the number of ... matches the pattern
    ]

matcher = build_matcher(pattern)
bindings = matcher(data)

template = build_template(template_spec)
table = template(bindings)

assert table == [
    ["2022-02-20", 1300, 7, "ON"],
    ["2022-02-20", 1700, 7, "OFF"],
    ["2022-02-20", 1100, 5, "ON"],
    ["2022-02-20", 1800, 5, "OFF"],
]

Inspiration

Matcho was inspired by Scheme's syntax-rules pattern language. The Lisp dialect Scheme allows programmers to define macros using pattern matching and template substitution. Since code in Scheme consists of list this enables cool syntax transformations. In Python we are limited to transforming data, but that's cool enough.

Why not just use Python 3.10's match syntax instead?

The new match syntax is great and it's even used by the implementation of Macho. However, it has one shortcoming: names can only capture one value. While it's possible to match an arbitary number of list items with [*items], it's not possible to do something like [*{"nested": item}], where we would like to capture the values of in a sequence of dictionaries. In Matcho, this is possible with a pattern of the form [{"nested": item}, ...].

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

matcho-0.1.1.tar.gz (6.6 kB view details)

Uploaded Source

Built Distribution

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

matcho-0.1.1-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

Details for the file matcho-0.1.1.tar.gz.

File metadata

  • Download URL: matcho-0.1.1.tar.gz
  • Upload date:
  • Size: 6.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1

File hashes

Hashes for matcho-0.1.1.tar.gz
Algorithm Hash digest
SHA256 29c083d53ff9bef136bca649ad49331e32f7c98e561ae7d74a8e84147e4f3d53
MD5 e9ad1dd0531d3fe923e31be5eec5f8a5
BLAKE2b-256 76611c878b7f33aef66dc6cdeeaa313bb376ff59a83b5903be0c89326ebd4dd8

See more details on using hashes here.

File details

Details for the file matcho-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: matcho-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 7.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1

File hashes

Hashes for matcho-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1ea5365d3f54cb6e9760fa68a67756f4b88f926f019b90dec7e49beaf90d36b2
MD5 10166b71f1e75f1f6370dd6aa6c57659
BLAKE2b-256 fa9219b87df8bc7b81b5ac2ace6fdc0b8a27ffa01c997a47b87ef40ee43e0358

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