快速背景:编写模块。我的一个对象有可能成功完成或未成功完成的方法 - 取决于我模块下面使用的框架。因此,一些方法首先需要检查他们实际拥有的框架。解决这个问题的当前方法是:
def framework_dependent_function():
try:
import module.that.may.not.be.available
except ImportError:
# the required functionality is not available
# this function can not be run
raise WrongFramework
# or should I just leave the previous exception reach higher levels?
[ ... and so on ... ]
然而我心中的一些东西一直告诉我,在文件中间进行导入是一件坏事。不记得为什么,甚至不能想出一个理由 - 除了稍微杂乱的代码,我猜。
那么,做我在这里做的事情有什么彻头彻尾的错吗?也许是在__init__
附近的某个地方侦察模块运行环境的其他方法吗?
答案 0 :(得分:3)
此版本可能更快,因为并非每次调用该函数都需要尝试import
必要的功能:
try:
import module.that.may.not.be.available
def framework_dependent_function():
# whatever
except ImportError:
def framework_dependent_function():
# the required functionality is not available
# this function can not be run
raise NotImplementedError
这也允许您单独尝试import
模块,然后定义单个块中可能不可用的所有函数,甚至可能
def notimplemented(*args, **kwargs):
raise NotImplementedError
fn1 = fn2 = fn3 = notimplemented
将它放在文件的顶部,靠近其他导入,或放在一个单独的模块中(我当前的项目有一个名为utils.fixes
)。如果您不喜欢try
/ except
块中的函数定义,请执行
try:
from module.that.may.not.be.available import what_we_need
except ImportError:
what_we_need = notimplemented
如果这些功能需要是方法,那么您可以稍后将它们添加到class
:
class Foo(object):
# assuming you've added a self argument to the previous function
framework_dependent_method = framework_dependent_function
答案 1 :(得分:1)
与larsmans建议类似,但略有改变
def NotImplemented():
raise NotImplementedError
try:
import something.external
except ImportError:
framework_dependent_function = NotImplemented
def framework_dependent_function():
#whatever
return
我不喜欢导入的try: except:
中的函数定义的概念
答案 2 :(得分:1)
您还可以使用imp.find_module
(请参阅here)以检查是否存在特定模块。