Why does a python module act like a singleton?

python, singleton

Solution

This is the Python Language Reference's description of how importing a module works:

(1) find a module, and initialize it if necessary; (2) define a name or names in the local namespace

(Emphasis added.) Here, initializing a module means executing its code. This execution is only performed if necessary, i.e. if the module was not previously imported in the current process. Since Python modules are first-class runtime objects, they effectively become singletons, initialized at the time of first import.

Note that this means that there's no need for a `get_state_dict_code` function; just initialize `state_code_dict` at top-level:

state_code_dict = generate_state_code_dict()

For a more in-depth explanation, see this talk by Thomas Wouters, esp. the first part — around 04:20 — where he discusses the "everything is runtime" principle.

Problem

I create a dictionary from a remote database as part of my application run. This process is pretty I/O heavy, so I've decided to create a "singleton" instance of this dictionary and just call it as it is needed in my application. The code looks like (in `Dictionaries.py`): ``` state_code_dict = None def get_state_code_dict(): global state_code_dict if state_code_dict == None: state_code_dict = generate_state_code_dict() return state_code_dict ``` I then import and call the `get_state_code_dict()` function where needed. I added a print statement to check if `state_code_dict` was being reinitialized or reused, and I found it was being reused (which is the functionality I want). Why is the instance of `state_code_dict` surviving the application run? Edit I import the `get_state_code_dict` function in multiple files.

Original source