Skip to main content

A collection of python decorators I wish existed before

Project description

utde

A collection of utility decorators to simplify my life.

Persist

Instead of recomputing an expensive function annotate it with a generic_persist decorator. This decorator allows you to specify:

- key_or_fn: Either a string or a function
that generates a string from the wrapped_fn args
- load_fn: A function that is used to retrieve
stored data from key
- store_fn: A function that is used to store
the results of the "expensive" function call so that
it can be loaded next time instead

Example:

from utde import generic_persist

cache = dict()

def key_fn(day_str):
    year, month, day = day_str.split("-")
    return f"{year}/{month}/{day}"

def load_fn(key):
    if key in cache:
        return cache[key]

def store_fn(x, key):
    cache[key] = x

@generic_persist(key_fn, load_fn, store_fn)
def wrapped_fn(x, day_str):
    print("Imagine an expensive operation")
    return x * 2

Pandas (optional)

pip install utde[pandas]

There is a overloaded version for pandas that will load/store using the pickle format. Then you only have to provide where to load/store the file from/to.

WARNING: Only provide a key to a location you trust in, as unpickling a pickle file may execute arbitrary code.

import pandas as pd
from utde import persist_pd

@persist_pd(lambda year: f"yearly_report_{year}.pkl")
def yearly_report(year: str) -> pd.DataFrame:
    return pd.DataFrame(data={"year": [year], "profit": [42]})

Timer

Although its a simple function to write I often reinvented the wheel and wrote a function/decorator to track the execution time of a function of interest.

from utde import timer
import time

@timer
def slow_fn():
    time.sleep(2)

slow_fn()

Output:

INFO: `slow_fn` ellapsed time: 2.000s

Checks

Some decorators which can come in handy when working with jupyter notebooks

Dynamic type checking

Given a function with type annotations the decorator @check will assert that the function is not called with types incompatible with the function annotation. Note that there is some performance overhead since the code will be dynamicially passed to beartype which handles dynamic type checking.

from utde import check

@check
def integer_sum(x: int, y:int):
    return x + y

integer_sum(10, 10)  # works
integer_sum(1.25, 2.5)  # raises an utde.errors.TypeCheckError

Note: I didn't use pydantic as it didn't complain when I tried to call a function foo(x: int) with foo(1.0). This might be a design decision however I personally prefer stricter type checking here.

Experemental: Linting

Note: Linting is currently only supported where the function resides in a classical python file e.g. foo.py. I'm working on making this feature available at least in jupyter notebooks

If not disabled via @check(enable_lint_checks=False), @check will check the fn code for linting errors and raise a utde.errors.LintCheckError if ruff detects an error that overlaps with the function definition call.

This function will fail with an error:

from utde import lint

@lint
def fn_with_unused_variable():
    unused_var = 42

however the following code will pass since the function fn_with_unused_variable is not decorated with @lint:

from utde import lint

def fn_with_unused_variable():
    unused_var = 42

@lint
def super_clean_function():
    used_var = 10
    return used_var + 32

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

utde-0.1.7.tar.gz (9.2 kB view details)

Uploaded Source

Built Distribution

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

utde-0.1.7-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file utde-0.1.7.tar.gz.

File metadata

  • Download URL: utde-0.1.7.tar.gz
  • Upload date:
  • Size: 9.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for utde-0.1.7.tar.gz
Algorithm Hash digest
SHA256 a4b2c1018265aa595438f6b03fe9bdbf92557314e3f9d75016fbe00a01b5dc0a
MD5 1df92121352643372257d8909f779c6d
BLAKE2b-256 ae0bd59cbf6ab2a48723a5f0515e5d9e746430e182e60afda5ac0cd7a42d61fd

See more details on using hashes here.

File details

Details for the file utde-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: utde-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 7.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for utde-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 6d07c145a51d6d3dd9316ce400e53f2fd1a07f6e3221ba50a0234034a9396931
MD5 e6ef3a44d14c6abd2fcc85b48821fe12
BLAKE2b-256 3c22f6c9812aaaa83b05f9bdf8338e23afed5fc09c91e695bcd5243bf08e9247

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