我希望在我的课程中动态导入模块,具体取决于某些条件。
class Test(object):
def __init__ (self,condition):
if condition:
import module1 as mymodule
else:
import module2 as mymodule
self.mymodule = mymodule
def doTest(self):
self.mymodule.doMyTest
其中module1和module2以不同的方式实现doMyTest。
将其称为
mytest1 = Test(true) # Use module1
mytest2.doTest()
mytest2 = Test(false) # Use module2
mytest2.doTest()
这有效,但可能有更惯用的方法吗?有任何可能的问题吗?
答案 0 :(得分:1)
当然,通常你不想在__init__
方法的中间导入模块,但是测试类是该规则的一个明显的例外,所以让我们忽略那个部分并想象你在顶级:
if test_c_implementation:
import c_mymodule as mymodule
else:
import py_mymodule as mymodule
这完全是惯用的。实际上,您可以在stdlib和核心开发人员编写的其他代码中看到类似的代码。
除了非常常见的EAFP案例,其中条件就是避免异常,在这种情况下,这样做更为惯用:
try:
import lxml.etree as ET
except ImportError:
import xml.etree.cElementTree as ET