Skip to main content

A high-performance, hierarchical, thread-safe mapping library for Python.

Project description

Lattix

Tests Coverage Status Python Version License: BSD

PyPI Version PyPI Python Versions

mypy ruff black

Lattix is a high-performance, hierarchical mapping library designed for complex data pipelines and multi-threaded environments. It combines the flexibility of a dictionary with the power of tree-like structures, offering dot-access, path-traversal, and a unique inherited locking mechanism for atomic subtree operations.

from lattix import Lattix

conf = Lattix(lazy_create=True)

conf.database.credentials.user = "admin"
conf["database/credentials/port"] = 5432

conf.database.credentials.to_dict()
# {'user': 'admin', 'port': 5432}

Key Features

  • Hierarchical Access: Use dot-notation (d.user.profile.id) or path-strings (d["user/profile/id"]) with configurable separators.
  • Lazy Creation: Automatically build nested structures on the fly with lazy_create=True.
  • Thread-Safe Inheritance: Advanced lock-sharing where children nodes inherit their parent's RLock, ensuring consistent synchronization across entire subtrees.
  • Immutability (Freeze): Protect your data from accidental changes in production using d.freeze().
  • Set-Like Logic: Perform deep merges, intersections, and differences using standard operators: &, |, -, and ^.
  • Data-Science Ready: Built-in, lazy-loading adapters for NumPy, Pandas, PyTorch, and Xarray. No hard dependencies required.
  • Enhanced Serialization: Native support for high-fidelity YAML (preserving Path, Decimal, datetime), JSON, Msgpack, and Orjson.
  • First-class Typing: Fully typed with Python generics and .pyi stubs for perfect autocompletion in VS Code and PyCharm.

Installation

1. Install via PyPI (Recommended)

# Basic
pip install py-lattix

# With all adapters (NumPy, Pandas, etc.)
pip install "py-lattix[full]"

2. Install via Github:

# Basic
pip install git+https://github.com/YuHao-Yeh/py-lattix.git

# With all adapters (NumPy, Pandas, YAML support, etc.)
pip install "py-lattix[full] @ git+https://github.com/YuHao-Yeh/py-lattix.git"

3. Install from Source

# 1. Clone the repository
$ git clone https://github.com/YuHao-Yeh/py-lattix
$ cd py-lattix

# 2. Install in editable mode
pip install -e

# 3. (Optional) Install testing dependencies
pip install -e ".[test,full]"

Quick Start

Basic Usage & Path Access

from lattix import Lattix

# Initialize with data or kwargs
conf = Lattix(meta={"version": "1.0"}, lazy_create=True, sep=":")

# Path-style access
conf["app:settings:theme"] = "dark"

# Dot-style access (even for paths created above)
print(conf.app.settings.theme)  # Output: "dark"

# Lazy creation
conf.database.connection.timeout = 30

# Convert entire tree back to a plain serializable dict
conf.to_dict()
# {'meta': {'version': '1.0'}, 'app': {'settings': {'theme': 'dark'}}, 'database': {'connection': {'timeout': 30}}}

Inherited Thread Safety

Lattix solves the "Subtree Locking" problem. When a node is locked, all its children (present or future) share the same lock instance.

import threading

tree = Lattix(enable_lock=True, lazy_create=True)

def update_config():
    with tree: # Acquires global lock for the whole tree
        tree.server.status = "upgrading"
        tree.server.port = 9000
        tree.server.last_check = "2026-01-10"
        # No other thread can modify 'tree' or any of its children 
        # until this block finishes.

threading.Thread(target=update_config).start()

Production Safety: Freezing

Prevent accidental modifications to your configuration once it is loaded.

conf = Lattix({"api": {"key": "secret"}})
conf.freeze()

conf.api.key = "new-key" 
# Raises: ModificationDeniedError

Advanced Operations

Logical Operations (Deep Merging)

base = Lattix({"api": {"host": "localhost", "port": 8080}})
user = Lattix({"api": {"port": 9000}, "debug": True})

# Deep Union (Merge)
final = base | user
# Result: api.host=localhost (preserved), api.port=9000 (overwritten), debug=True

# Intersection (Common Keys)
common = base & user
# Result: api.port=9000 (overwritten)

SQL-style Joins

d1 = Lattix({"a": 1, "b": 2})
d2 = Lattix({"b": 20, "c": 30})

# Inner join: keys existing in both
res = d1.join(d2, how="inner")
# Result: Lattix({'b': (2, 20)})

Data Science Integrations

Lattix recognizes complex types and handles them automatically during serialization.

import numpy as np
import pandas as pd
import torch

d = Lattix(lazy_create=True)
d.array = np.array([1, 2, 3])
d.df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
d.tensor = torch.randn(3, 3)

# Serialization handles NumPy/Pandas/Torch -> Python conversion automatically
print(d.json())

Enhanced YAML

Lattix preserves complex Python types in YAML that standard loaders usually break.

from decimal import Decimal
from pathlib import Path

d = Lattix({"price": Decimal("19.99"), "path": Path("/usr/bin")})

# Export with custom YAML tags
yaml_out = d.yaml(enhanced=True)
# Output:
# price: !decimal '19.99'
# path: !path '/usr/bin'

Diagnostics & Testing

Verify your environment and adapter availability via the CLI:

python -m lattix

Run internal doctests to verify library integrity:

python -m lattix --test

Similar Projects

  • addict: Lightweight recursive dictionary with dot-access.
  • Easydict: A fast and full-featured dict-like tree container.
  • python-box: Robust dictionary wrapper with path and dot-access support.

License

Lattix is released under the BSD License. See the LICENSE for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request or open an issue on GitHub.

We maintain a high test coverage. To run the suite:

  1. Clone the repo: git clone https://github.com/YuHao-Yeh/py-lattix
  2. Install dev dependencies: pip install -e ".[test]"
  3. Run tests: pytest
  4. Ensure typing is correct: mypy src/lattix

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

py_lattix-0.1.0.tar.gz (92.5 kB view details)

Uploaded Source

Built Distribution

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

py_lattix-0.1.0-py3-none-any.whl (76.8 kB view details)

Uploaded Python 3

File details

Details for the file py_lattix-0.1.0.tar.gz.

File metadata

  • Download URL: py_lattix-0.1.0.tar.gz
  • Upload date:
  • Size: 92.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for py_lattix-0.1.0.tar.gz
Algorithm Hash digest
SHA256 898a9464dc7c58c5153ac8317b50d2962c8d0c85257a8c7578f4c5c316939fd4
MD5 6e6f21cd9fa18ecba359a3a1aed2c260
BLAKE2b-256 fd0156c5bf4f0d8e29b6aad2097e1e350378136a6c7af1e80021b7fb5e35d7a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_lattix-0.1.0.tar.gz:

Publisher: publish.yml on YuHao-Yeh/py-lattix

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file py_lattix-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: py_lattix-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 76.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for py_lattix-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 45ce121701c4d9725d4a26868095ca83790db5327d56cde341cb96e07723a3e0
MD5 09f5c04ed71416405aa28d1a3e75afa5
BLAKE2b-256 cdfb51b43d903ae9b92e4f019b197ffa8fdfc5a47c7d2614a90c2a6ac10ce6b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for py_lattix-0.1.0-py3-none-any.whl:

Publisher: publish.yml on YuHao-Yeh/py-lattix

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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