Source code for b2luigi.core.parameter
import hashlib
import luigi
from luigi.parameter import _no_value
from inspect import signature
[docs]def wrap_parameter():
"""
Monkey patch the parameter base class (and with it all other parameters(
of luigi to include two additional parameters in its constructor:
``hashed`` and ``hash_function``.
Enabling the ``hashed`` parameter will use a hashed version of the
parameter value when creating file paths our of the parameters of a task
instead of the value itself. By default an md5 hash is used. A custom
hash function can be provided via the ``hash_function`` parameter. This
function should take one input, the value of the parameter. It is up
to the user to ensure a unique string is created from the input.
This is especially useful when you have list, string or dict parameters,
where the resulting file path may include "/" or "{}".
"""
import b2luigi
parameter_class = b2luigi.Parameter
def serialize_hashed(self, x):
if self.hash_function is None:
return "hashed_" + hashlib.md5(str(x).encode()).hexdigest()
else:
return self.hash_function(x)
old_init = parameter_class.__init__
def __init__(self, hashed=False, hash_function=None, *args, **kwargs):
old_init(self, *args, **kwargs)
if hash_function is not None:
n_params = len(signature(hash_function).parameters)
assert n_params == 1, "Custom hash function can have only" f" 1 argument, found {n_params}"
self.hash_function = hash_function
if hashed:
self.serialize_hashed = lambda x: serialize_hashed(self, x)
parameter_class.__init__ = __init__
class BoolParameter(luigi.BoolParameter):
"""Copied BoolParameter without default value"""
def __init__(self, **kwargs):
kwargs.setdefault("default", _no_value)
luigi.Parameter.__init__(self, **kwargs)