Skip to main content

A cached property decorator with context-aware isolation

Project description

contextually-cached-property

A Python descriptor that caches property values per context variable, providing isolated caches for concurrent contexts like asyncio tasks.

Why?

Python's built-in functools.cached_property uses a single cache shared across all contexts. This can cause issues in concurrent applications where different tasks or threads need independent cached values.

contextually_cached_property solves this by using contextvars.ContextVar to maintain separate caches per context, while also using weak references to allow proper garbage collection of instances.

Installation

pip install contextually-cached-property

Requires Python 3.14+.

Usage

from contextually_cached_property import contextually_cached_property


class ExpensiveResource:
    @contextually_cached_property
    def connection(self) -> Connection:
        return create_connection()

The cached value is computed once per context per instance. Different asyncio tasks will each get their own cached value:

import asyncio


class TaskLocalData:
    @contextually_cached_property
    def request_id(self) -> str:
        return generate_unique_id()


data = TaskLocalData()


async def task_a():
    print(data.request_id)  # e.g., "abc123"


async def task_b():
    print(data.request_id)  # e.g., "xyz789" (different from task_a)


async def main():
    await asyncio.gather(task_a(), task_b())

Invalidating the cache

Delete the attribute to clear the cached value for the current context:

del instance.cached_property_name

Development

This project uses Poetry for dependency management.

# Install dependencies
poetry install

# Run tests
pytest

# Run linting
ruff check

# Run type checking
mypy .

Releasing

This project uses git tags for versioning and automated publishing via Forgejo Actions.

Pre-release (TestPyPI)

Create a pre-release tag to publish to TestPyPI for testing:

git tag v1.0.0-rc1
git push origin v1.0.0-rc1

Production release (PyPI)

Create a release tag to publish to PyPI:

git tag v1.0.0
git push origin v1.0.0

The workflow runs tests, linting, and type checking before publishing.

License

See LICENSE for details.

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

contextually_cached_property-0.1.1.tar.gz (14.5 kB view details)

Uploaded Source

Built Distribution

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

contextually_cached_property-0.1.1-py3-none-any.whl (15.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: contextually_cached_property-0.1.1.tar.gz
  • Upload date:
  • Size: 14.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.1 CPython/3.13.11 Linux/6.12.48+deb13-cloud-amd64

File hashes

Hashes for contextually_cached_property-0.1.1.tar.gz
Algorithm Hash digest
SHA256 514d70fcf34f0e948da3be6b9d0f5906e0ae4d210653040e6a581faf4d0151bd
MD5 a146154dbba439bc45c35d8a0d3e83ae
BLAKE2b-256 7b9fe2217ca18a141c9319c1181b2a1b1882651896f045296b0d58bcc34ab122

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for contextually_cached_property-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c0a68f87f9441d16778e9249da53e2bdd90475dea448c22f9db2974b4501c719
MD5 fab063811b0c2c6fefc064698658841f
BLAKE2b-256 9301ef2508b83f16831aa9e0db6d3235d36c3d4d5253f40d7819df8bd51ecc54

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