This (quick but strangely satisfying) recipe combines the use of random.choice with functools.partial from the standard library. It is a factory function returning random.choice pre-filled with its sequence of options.
1 2 3 4 5 6 7 8 9 | def picker(seq):
"""
Returns a new function that can be called without arguments
to select and return a random entry from the provided sequence
"""
from functools import partial
from random import choice
return partial(choice,seq)
|
When writing tests or generating test data I often use the standard library's random.choice function. This function chooses one random element from a sequence passed in as an argument. It becomes tiresome to keep passing the same arguments around so I wrote this function. doctests are tricky with random return values, but this output might be illustrative:
>>> colors = ['Red','Orange','Yellow','Green','Blue']
>>> color_picker = picker(colors)
>>> color_picker()
'Yellow'
>>> color_picker()
'Green'
>>> [color_picker() for c in range(8)]
['Orange', 'Red', 'Blue', 'Yellow', 'Yellow', 'Orange', 'Orange', 'Blue']
The meat of this recipe is one expression ( partial(choice,seq) ). It might be argued that it's not worth packaging this into a function. However, when combined with the inline import statements, it's a handy gadget to include in a test_utils.py or similar module.