I am writing a Python script where some of the core functionalities can be done by another existing library. Unfortunately, while that library has more features, it is also slower, so I'd like if the user could at runtime select whether they want to use that library or my own fast and simple implementation. Unfortunately I'm stuck at a point where I don't understand some of the workings of Python's module system.
Suppose that my main program was main.py
, that the (optional) external module is in module_a.py
and that my own fast and simple implementation of module_a
together with the actual program code that uses either my own implementation or the one of module_a
is in the file module_x.py
:
main.py:
import module_x
module_x.test(True)
module_x.test(False)
module_a.py:
class myclass():
def __init__(self):
print("i'm myclass in module_a")
module_x.py:
class myclass():
def __init__(self):
print("i'm myclass in module_x")
def test(enable_a):
if enable_a:
try:
from module_a import myclass
except ImportError:
global myclass
enable_a = False
else:
global myclass
i = myclass()
When I now execute main.py
I get:
$ python3 main.py
i'm myclass in module_a
i'm myclass in module_a
But why is this? If False
is passed to test()
then the import of the module_a
implementation should never happen. Instead it should only see myclass
from the local file. Why doesn't it? How do I make test()
use the local definition of myclass
conditionally?
My solution is supposed to run in Python3 but I see the same effect when I use Python2.7.