Decorators that Capture Data¶
memlist(data, skip=False)
¶
Remembers input/output of a function in python list.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
data |
List |
a list to push received data into |
required |
skip |
bool |
skips the calculation if kwargs appear in data already |
False |
Example
from memo import memlist
data = []
@memlist(data=data)
def simulate(a, b):
return {"result": a + b}
# The `@memlist` decorator will allow the inputs/outputs to
# be saved in the provided `data` list.
for a in range(5):
for b in range(10):
simulate(a=a, b=b)
assert len(data) == 50
# If we keep running more loops the list will grow.
for a in range(6, 10 + 1):
for b in range(11, 20 + 1):
simulate(a=a, b=b)
assert len(data) == 100
Source code in memo/_base.py
def memlist(data: List, skip: bool = False):
"""
Remembers input/output of a function in python list.
Arguments:
data: a list to push received data into
skip: skips the calculation if kwargs appear in data already
Example
```python
from memo import memlist
data = []
@memlist(data=data)
def simulate(a, b):
return {"result": a + b}
# The `@memlist` decorator will allow the inputs/outputs to
# be saved in the provided `data` list.
for a in range(5):
for b in range(10):
simulate(a=a, b=b)
assert len(data) == 50
# If we keep running more loops the list will grow.
for a in range(6, 10 + 1):
for b in range(11, 20 + 1):
simulate(a=a, b=b)
assert len(data) == 100
```
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
# We might be able to skip if the parameters
# already appear in the dataset.
if skip and _contains(kwargs, data):
return None
data.append({**kwargs, **result})
return result
return wrapper
return decorator
memfile(filepath, skip=False)
¶
Remembers input/output of a function in a jsonl file on disk.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
filepath |
str |
path to write data to |
required |
skip |
bool |
skips the calculation if kwargs appear in data already |
False |
from memo import memfile
@memfile(filepath="tmpfile.jsonl")
def simulate(a, b):
return {"result": a + b}
for a in range(5):
for b in range(10):
simulate(a=a, b=b)
Source code in memo/_base.py
def memfile(filepath: str, skip: bool = False):
"""
Remembers input/output of a function in a jsonl file on disk.
Arguments:
filepath: path to write data to
skip: skips the calculation if kwargs appear in data already
```python
from memo import memfile
@memfile(filepath="tmpfile.jsonl")
def simulate(a, b):
return {"result": a + b}
for a in range(5):
for b in range(10):
simulate(a=a, b=b)
```
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if skip:
if pathlib.Path(filepath).exists():
with open(filepath, "r") as f:
datalist = [orjson.loads(line) for line in list(f)]
else:
datalist = []
with open(filepath, "a") as f:
if skip and _contains(kwargs, datalist):
return None
ser = orjson.dumps(
{**kwargs, **result},
option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY,
)
f.write(ser.decode("utf-8") + "\n")
return result
return wrapper
return decorator
memfunc(callback)
¶
Remembers input/output of a function by printing.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
callback |
Callable |
callback function that receives a dictionary with logged info |
required |
from memo import memfunc, memlist
data = []
@memlist(data=data)
@memfunc(callback=print)
def simulate(a, b):
return {"result": a + b}
for a in range(5):
for b in range(10):
simulate(a=a, b=b)
# You should now see print statements, and this holds:
assert len(data) == 50
Source code in memo/_base.py
def memfunc(callback: Callable):
"""
Remembers input/output of a function by printing.
Arguments:
callback: callback function that receives a dictionary with logged info
```python
from memo import memfunc, memlist
data = []
@memlist(data=data)
@memfunc(callback=print)
def simulate(a, b):
return {"result": a + b}
for a in range(5):
for b in range(10):
simulate(a=a, b=b)
# You should now see print statements, and this holds:
assert len(data) == 50
```
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
callback({**kwargs, **result})
return result
return wrapper
return decorator
memweb(url)
¶
Remembers input/output of a function by sending it over http to an endpoint.
Important
Note that this decorator requires an extra dependeny. Ensure it is installed properly by running either;
python -m pip install "memo[web]"
You can also install it by installing all optional dependencies.
python -m pip install "memo[all]"
Parameters:
Name | Type | Description | Default |
---|---|---|---|
url |
str |
web url to post json to |
required |
Source code in memo/_http.py
def memweb(url: str):
"""
Remembers input/output of a function by sending it over http to an endpoint.
Important:
Note that this decorator requires an extra dependeny. Ensure it is installed
properly by running either;
```
python -m pip install "memo[web]"
```
You can also install it by installing all optional dependencies.
```
python -m pip install "memo[all]"
```
Arguments:
url: web url to post json to
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
with httpx.Client() as client:
_ = client.post(url, data={**kwargs, **result})
return result
return wrapper
return decorator