Recently I’ve been working with various applications that require importing large JSON definition files which detail complex application settings. Often, these files are required by multiple auxiliary modules in the codebase. All principles of software engineering point towards importing this sort of file only once, regardless of how many secondary modules it is used in.
Related Articles
My instinctive approach to this would be to have a main handler module read in the file and then pass its contents as a Class initialization argument:
# main_handler.py import json from module1 import Class1 from module2 import Class2 with open("settings.json") as f: settings = json.load(f) init1 = Class1(settings=settings) init2 = Class2(settings=settings)
The problem with this is that if you have an elaborate import process, and multiple files to import, it could start to look messy. I recently discovered that this multiple initialization argument approach isn’t actually necessary.
In Python, you can actually import the same settings loader module in the two auxiliary modules (module1 and module2), and python will only load it once:
# main_handler.py from module1 import Class1 from module2 import Class2 init1 = Class1() init2 = Class2()
# module1.py import settings_loader class Class1: def __init__(self): self.settings = settings_loader.settings
# module2.py import settings_loader class Class2: def __init__(self): self.settings = settings_loader.settings
# settings_loader.py import json with open("settings.json") as f: print "Loading the settings file!" settings = json.load(f)
Now when we test this out in the terminal:
MRMAC:importtesting mruttley$ MRMAC:importtesting mruttley$ MRMAC:importtesting mruttley$ python main_handler.py Loading the settings file! MRMAC:importtesting mruttley$
Despite calling
import settings_loadertwice, Python actually only called it once. This is extremely useful but also could cause headaches if you actually wanted to import the file twice. If so, then I would include the settings importer inside the
__init__()of each ClassX and instantiate it twice.
This post first appeared on Ikigomu | A Data Science, NLP And Personal Blog By, please read the originial post: here