如果你只需要引入一个外部库,我建议你采用以下方式:
try:
import weirdModule
available = True
except ImportError:
available = False
def func_requiring_weirdmodule():
if not available:
raise ImportError('weirdModule not available')
...
只有在需要提供更详细的错误信息时才需要使用条件判断和错误检查。如果不需要,可以省略它并让 Python 在尝试调用未导入的模块时抛出相应的错误,就像您当前设置中所做的那样。
如果多个函数都使用weirdModule
,可以将检查封装成一个函数:
def require_weird_module():
if not available:
raise ImportError('weirdModule not available')
def f1():
require_weird_module()
...
def f2():
require_weird_module()
...
另一方面,如果您有多个库需要被不同的函数导入,您可以动态加载它们。虽然看起来不太美观,但是Python会缓存它们,这并没有什么问题。我建议使用importlib
。
import importlib
def func_requiring_weirdmodule():
weirdModule = importlib.import_module('weirdModule')
如果你的多个函数导入了复杂的外部模块,你可以将它们封装进:
def import_external(name):
return importlib.import_module(name)
def f1():
weird1 = import_external('weirdModule1')
def f2():
weird2 = import_external('weirdModule2')
最后,您可以创建一个处理程序来防止重复导入同一模块,例如:
class Importer(object):
__loaded__ = {}
@staticmethod
def import_external(name):
if name in Importer.__loaded__:
return Importer.__loaded__[name]
mod = importlib.import_module(name)
Importer.__loaded__[name] = mod
return mod
def f1():
weird = Importer.import_external('weird1')
def f2():
weird = Importer.import_external('weird1')
尽管我相信importlib在幕后进行缓存,你并不需要进行手动缓存。
简言之,虽然看起来有些丑陋,但在Python中动态导入模块没有任何问题。实际上,许多库都依赖于此。另一方面,如果只是针对3个方法访问1个外部函数的特殊情况,请使用你的方法或者我的第一个方法,以防需要添加自定义异常处理。
classB
是classB.py中的全部内容,那么我不理解pass
的目的。否则,我会违背纯粹性并选择实用性(在class
定义内部导入它)。 - Ma0ClassB
是classB.py
中唯一的类,但只有 2-3 个方法依赖于someWeirdPackage
,因此我使用了pass
,以便其他人可以使用该类中的其他方法。 - SalsomeWeirdPackage
中使用了几个功能,那么有一种方法可以自己编写该功能,而不必导入整个软件包? - Davy M