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.
I voted larsmans answer, i just wanted to add an example.
hello.py:
hi = 'hello'
print(hi)
def print_hi():
print(hi)
ipython session:
In [1]: from hello import print_hi
hello
In [2]: print_hi()
hello
In [3]: from hello import print_hi
In [4]: import hello
In [5]: hello.print_hi()
hello
Look that the imports at lines 3 and 4 don't output "hello" as the import in line 1 did, that means the code isn't re-executed.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With