The try: method does not need to be global — it can be used in any scope and so modules can be “lazy-loaded” at runtime. For example:
def foo():
try:
import external_module
except ImportError:
external_module = None
if external_module:
external_module.some_whizzy_feature()
else:
print("You could be using a whizzy feature right now, if you had external_module.")
When your script is run, no attempt will be made to load external_module. The first time foo() is called, external_module is (if available) loaded and inserted into the function’s local scope. Subsequent calls to foo() reinsert external_module into its scope without needing to reload the module.
In general, it’s best to let Python handle import logic — it’s been doing it for a while. 🙂