Source code for skchem.utils.decorators
#! /usr/bin/env python
#
# Copyright (C) 2016 Rich Lewis <rl403@cam.ac.uk>
# License: 3-clause BSD
"""
# skchem.utils.decorators
Decorators for skchem functions.
"""
import pandas as pd
from functools import wraps
from .. import core
[docs]def takes_mol_series(func):
@wraps(func)
@takes_pandas
def inner(inp, *args, **kwargs):
if isinstance(inp, pd.DataFrame):
inp = inp.structure
return func(inp, *args, **kwargs)
return inner
[docs]def method_takes_mol_series(func):
@wraps(func)
def inner(self, *args, **kwargs):
return takes_mol_series(lambda *args, **kwargs: func(self, *args, **kwargs))(*args, **kwargs)
return inner
[docs]def takes_pandas(func):
@wraps(func)
def inner(inp, *args, **kwargs):
single = False
if isinstance(inp, core.Mol):
single = True
inp = pd.Series({inp.name: inp})
elif isinstance(inp, (list, tuple)):
inp = pd.Series(inp, index=[mol.name for mol in inp])
elif isinstance(inp, dict):
inp = pd.Series(inp)
elif isinstance(inp, (pd.Series, pd.DataFrame)):
pass
else:
raise NotImplementedError('{} cannot take object of type: {}'.format(func.__name__, type(inp)))
res = func(inp, *args, **kwargs)
if single:
return res.iloc[0]
else:
return res
return inner
[docs]def method_takes_pandas(func):
@wraps(func)
def inner(self, *args, **kwargs):
return takes_pandas(lambda *args, **kwargs: func(self, *args, **kwargs))(*args, **kwargs)
return inner