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.
Cheers,
f
###
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.
:Examples:
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
return decor
_______________________________________________
Numpy-discussion mailing list
[email protected]
http://projects.scipy.org/mailman/listinfo/numpy-discussion