Howdy (esp. Alan McIntyre):
I've been using numpy's decorators a lot, many thanks to Matthew B and Alan for this code! Here's a snippet to auto-generate labeling decorators that might come in handy to avoid repetition in creating decos like @slow & friends. It's doctested as well as validating things a bit, feel free to use it if you find it useful.
### def make_label_dec(label,ds=None): """Factory function to create a decorator that applies one or more labels.
:Parameters: label : string or sequence One or more labels that will be applied by the decorator to the functions it decorates. Labels are attributes of the decorated function with their value set to True.
:Keywords: ds : string An optional docstring for the resulting decorator. If not given, a default docstring is auto-generated.
:Returns: A decorator.
A simple labeling decorator: >>> slow = make_label_dec('slow') >>> print slow.__doc__ Labels a test as 'slow'
And one that uses multiple labels and a custom docstring: >>> rare = make_label_dec(['slow','hard'], ... "Mix labels 'slow' and 'hard' for rare tests.") >>> print rare.__doc__ Mix labels 'slow' and 'hard' for rare tests.
Now, let's test using this one: >>> @rare ... def f(): pass ... >>> >>> f.slow True >>> f.hard True """
if isinstance(label,basestring): labels = [label] else: labels = label
# Validate that the given label(s) are OK for use in setattr() by doing a # dry run on a dummy function. tmp = lambda : None for label in labels: setattr(tmp,label,True)
# This is the actual decorator we'll return def decor(f): for label in labels: setattr(f,label,True) return f # Apply the user's docstring if ds is None: ds = "Labels a test as %r" % label decor.__doc__ = ds