Skip to main content

PyPI - Version PyPI - Python Version Pytest MIT License Codecov GitHub Workflow Status

AST Pattern Engine

A powerful, programmatic, regex-inspired AST pattern matching and manipulation library for Python.

Philosophy: The "Gradual Pipeline"

Instead of relying on fragile regex on source code or magic string-to-AST parsers, ast_pattern_engine provides an internal DSL for building explicit, structural patterns.

It is designed with a "Gradual Pipeline" philosophy: instead of writing one massive, monolithic pattern expression to do everything at once, you chain small, focused patterns and visitors. Like casting a wide net and progressively filtering down in stages.

Installation

pip install ast_pattern_engine
uv add ast_pattern_engine

(Requires Python 3.10+)

Quick Start

Here is a simple pipeline that rewrites dict.get("key") calls into direct subscript access dict["key"]:

from typing import Any
import ast
from ast_pattern_engine import BottomUpPatternTransformer, Bind, NodePattern

source = "value = my_dict.get(other_dict.get('foo'))"
tree = ast.parse(source)

# 1. Build the explicit structural pattern
# Matches: <obj>.get(<key>)
pattern = [
    NodePattern(
        ast.Call,
        func=NodePattern(ast.Attribute, attr="get", value=Bind("obj")),
        args=Bind("key"),
    )
]

# 2. Define the rewrite logic
def rewrite_dict_get(bindings: dict[str, Any]) -> list[ast.AST]:
    obj = bindings["obj"]
    key = bindings["key"][0]  # args is a list

    # Return the new node to replace the matched node
    new_node = ast.Subscript(value=obj, slice=key, ctx=ast.Load())
    return [new_node]

# 3. Apply the transformer
# We use BottomUpPatternTransformer so nested `.get()` calls
# are safely transformed from the inside-out.
transformer = BottomUpPatternTransformer(pattern, {"key": rewrite_dict_get})
transformer.visit(tree)

print(ast.unparse(tree))
# Output: value = my_dict[other_dict['foo']]

(See the examples/ directory for full runnable code).

Primitives

The engine provides several primitives to build robust sequences:

  • NodePattern: Match specific AST node types and assert on their fields.
  • Collect / Bind: Extract sub-trees out of a matched pattern to use in your handlers.
  • OneOf: Match one of several possible patterns (similar to regex |).
  • Repetition: Match a pattern sequentially 1 or more times (similar to regex * and +).
  • Optional: Match a pattern 0 or 1 times (similar to regex ?).
  • Filter: Apply arbitrary Python lambdas to check node states during matching.

Templates

To reduce boilerplate when building patterns, the library includes a templates module with helpers for common operations:

  • match_call(func_name, **kwargs)
  • match_assign(target_name, value)
  • match_in_expr(pattern)

Metadata

Release files for ast-pattern-engine 1.0.2

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

Source distribution (sdist)

Source distribution for ast-pattern-engine 1.0.2
File Size Uploaded
ast_pattern_engine-1.0.2.tar.gz 23.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ast-pattern-engine 1.0.2
File Interpreter ABI Platform
ast_pattern_engine-1.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 38.3 kB

Release files / ast_pattern_engine-1.0.2.tar.gz

Download URL ast_pattern_engine-1.0.2.tar.gz
Size 23.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b37d77cbe44883a3692e6ffe8aab16674525d8b591ff6dc532ee04bf228c98cf
BLAKE2b-256 checksum
How to use checksums
f69cb87634f4619f933b7cfd6758b50582176153a02214c3ab2b4e55338aff91
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release files / ast_pattern_engine-1.0.2-py3-none-any.whl

Download URL ast_pattern_engine-1.0.2-py3-none-any.whl
Size 15.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f4bf6ceda274e4b9f375050991f17a639e295e0326b195ff2fa1a420c03fb204
BLAKE2b-256 checksum
How to use checksums
ed3759e040678c3f43a64dc504bd60a3c06f3e3035958fa9cd94bc98ad4116d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.2

Release history Release notifications | RSS feed

This release

1.0.2 This release

2 release files

1.0.1

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