I just started to program Python. As my first application I implemented an interactive console which automatically python modules before a new code block is evaluated. Here is the code:
### module "module_reloading_console.py"
import sys
import code
import imp
import readline
import os
class ModuleReloadingConsole(code.InteractiveConsole):
def __init__(self):
super().__init__()
readline.parse_and_bind("tab: complete")
self.stored_modifier_times = {}
self.check_modules_for_reload()
def runcode(self, code):
self.check_modules_for_reload()
super().runcode(code)
self.check_modules_for_reload() # maybe new modules are loaded
def check_modules_for_reload(self):
for module_name, module in sys.modules.items():
if hasattr(module, '__file__'):
module_modifier_time = os.path.getmtime(module.__file__)
if module_name in self.stored_modifier_times:
if module_modifier_time > self.stored_modifier_times[module_name]:
imp.reload(module)
self.stored_modifier_times[module_name] = module_modifier_time
else:
self.stored_modifier_times[module_name] = module_modifier_time
ModuleReloadingConsole().interact("Welcome to ModuleReloadingConsole")
Usage:
~: python3 module_reloading_console.py
Welcome to ModuleReloadingConsole
>>> import test
>>> test.foo
23
>>> test.foo # in the meanwhile change foo to '42' in test.py
42
Because I am really new to Python I want to now which improvements you have for the above code. Are there common Python conventions I have not considered?
marginal note: this code recipe (automatically upgrade class instances on reload()) would be a good improvement. Maybe also this article about dynamically reloading a python code might improve the code...