#!/usr/bin/python3 """ Test script for lru_timestamp function. usage: lru.py [-h] [-r REFRESH] [-s SLEEP] optional arguments: -h, --help show this help message and exit -r REFRESH, --refresh REFRESH refresh interval (default 60 min) -s SLEEP, --sleep SLEEP sleep interval (default 10 min) """ import argparse import datetime import functools import random import time def lru_timestamp(refresh_interval=60): """ Return a timestamp string for @lru_cache decorated functions. The returned timestamp is used as the value of an extra parameter to @lru_cache decorated functions, allowing for more control over how often cache entries are refreshed. The lru_timestamp function should be called with the same refresh_interval value for a given @lru_cache decorated function. The returned timestamp is for the benefit of the @lru_cache decorator and is normally not used by the decorated function. Positional arguments: refresh_interval -- in minutes (default 60), values less than 1 are coerced to 1, values more than 1440 are coerced to 1440 """ if not isinstance(refresh_interval, int): raise ValueError('refresh_interval must be an int from 1-1440') dt = datetime.datetime.now() if refresh_interval > 60: refresh_interval = min(refresh_interval, 60*24) fmt = '%Y%m%d' minutes = dt.hour * 60 else: refresh_interval = max(1, refresh_interval) fmt = '%Y%m%d%H' minutes = dt.minute ts = dt.strftime(fmt) age = minutes // refresh_interval return '{0}:{1:d}'.format(ts, age) @functools.lru_cache() def calulate(x, y, timestamp): """ Return random int for testing lru_timestamp function.""" print('performing calculation (not from cache), timestamp:', timestamp) return random.randint(x, y) def init(): """ Return parsed command line args.""" random.seed() parser = argparse.ArgumentParser(fromfile_prefix_chars='@') parser.add_argument('-r', '--refresh', type=int, dest='refresh', default=60, help='refresh interval (default 60 min)') parser.add_argument('-s', '--sleep', type=int, dest='sleep', default=10, help='sleep interval (default 10 min)') return parser.parse_args() def main(): """ Script main.""" args = init() print('refresh interval (min):', args.refresh) print('sleep interval (min):', args.sleep) print() refresh = args.refresh doze = args.sleep * 60 #num = calulate(1, 1000, lru_timestamp('junk')) #num = calulate(1, 1000, lru_timestamp(1.22)) #num = calulate(1, 1000, lru_timestamp(-1)) #num = calulate(1, 1000, lru_timestamp(2000)) while True: num = calulate(1, 1000, lru_timestamp(refresh)) print('calculation returned', num) time.sleep(doze) if __name__ == '__main__': main()