On 2024-03-11 16:53:00 -0400, Ivan "Rambius" Ivanov via Python-list wrote: > I am refactoring some code and I would like to get rid of a global > variable. Here is the outline:
... > The global cache variable made unit testing of the lookup(key) method > clumsy, because I have to clean it after each unit test. I refactored > it as: > > class Lookup: > def __init__(self): > self.cache = {} > > def lookup(key): > if key in self.cache: > return self.cache[key] > > value = None > > cmd = f"mycmd {key}" > proc = subprocess(cmd, capture_output=True, text=True, check=False) > if proc.returncode == 0: > value = proc.stdout.strip() > else: > logger.error("cmd returned error") > > self.cache[key] = value > return value > > Now it is easier to unit test, and the cache is not global. However, I > cannot instantiate Lookup inside the while- or for- loops in main(), > because the cache should be only one. I need to ensure there is only > one instance of Lookup - this is why I made it a global variable, so > that it is accessible to all functions in that script and the one that > actually needs it is 4 levels down in the call stack. [...] > I am looking for the same behaviour as logging.getLogger(name). > logging.getLogger("myname") will always return the same object no > matter where it is called as long as the name argument is the same. > > How would you advise me to implement that? Just add a dict of Lookup objects to your module: lookups = {} def get_lookup(name): if name not in lookups: lookups[name] = Lookup() return lookups[name] Then (assuming your module is also called "lookup", in all other modules do import lookup lo = lookup.get_lookup("whatever") ... v = lo.lookup("a key") In your test cases where you need many different lookup tables use lo = lookup.get_lookup("test1") ... lo = lookup.get_lookup("test2") ... lo = lookup.get_lookup("test3") hp PS: You don't have to put that in a separate module but I think it's a lot cleaner that way. -- _ | Peter J. Holzer | Story must make more sense than reality. |_|_) | | | | | h...@hjp.at | -- Charles Stross, "Creative writing __/ | http://www.hjp.at/ | challenge!"
signature.asc
Description: PGP signature
-- https://mail.python.org/mailman/listinfo/python-list