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.
Linting
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 check
@check
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 @check:
from utde import check
def fn_with_unused_variable():
unused_var = 42
@check
def super_clean_function():
used_var = 10
return used_var + 32
Note: Linting is currently only supported where the function
resides in some source file with suffix .py and .ipynb.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file utde-0.1.6.tar.gz.
File metadata
- Download URL: utde-0.1.6.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ad3d85c62f4825c0a113519a48a72fd238cabcbfdf61b0142562d7ee19af8c0
|
|
| MD5 |
d51e6e1a9220d7840b85b73689bea55a
|
|
| BLAKE2b-256 |
b3c40bf8f9aded58c473190a54825d3a18e3d1239b049f9615cecc462d6d6b4c
|
File details
Details for the file utde-0.1.6-py3-none-any.whl.
File metadata
- Download URL: utde-0.1.6-py3-none-any.whl
- Upload date:
- Size: 7.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18e0c0279c28f88b4ea9d4411e3491d7c1c1f95527fbfd4723ba3320a3c0d168
|
|
| MD5 |
8666e5f17d4d6fe4686bdd4296bf5690
|
|
| BLAKE2b-256 |
ce90e2341d5095a49b5ad3dbd53fd9b279e4745ce55b569ecc8a58494710f26a
|