from functools import reduce
from itertools import chain
from operator import attrgetter
from os import name, system
from typing import Any, List, Sequence, Tuple
__all__ = [
'clear',
'getattrs',
'map_getattr',
'rgetattr',
'rsetattr',
'slurp',
'to_string',
]
[docs]def slurp(fname: str) -> str:
"""
Reads a file and all its contents, returns a single string
"""
with open(fname, 'r') as f:
data = f.read()
return data
[docs]def clear() -> None:
"""
Clears the terminal screen from python, operating system agnostic
"""
system('cls' if name == 'nt' else 'clear')
[docs]def to_string(objects: List[object], sep: str=", ") -> str:
"""
Converts a list of objects into a single string
>>> to_string([1, 2, 3])
'1, 2, 3'
"""
return sep.join(map(str, objects))
[docs]def getattrs(obj: object, keys: Sequence[str]) -> Tuple[Any, ...]:
"""Supports getting multiple attributes from a model at once"""
return tuple(getattr(obj, key) for key in keys)
[docs]def map_getattr(attr: str, object_seq: Sequence[object]) -> Tuple[Any, ...]:
"""
Returns a map to retrieve a single attribute from a sequence of objects
"""
return tuple(map(attrgetter(attr), object_seq))
[docs]def rgetattr(obj: object, attrs: str) -> Any:
"""Get a nested attribute within an object"""
return reduce(getattr, chain([obj], attrs.split('.')))
[docs]def rsetattr(obj: object, attr: str, val: Any) -> None:
"""Sets a nested attribute within an object"""
pre, _, post = attr.rpartition('.')
return setattr(rgetattr(obj, pre) if pre else obj, post, val)